2013-05-01 3 views
1

Я пробовал решить эту проблему в течение почти 3 дней. И я до сих пор не знаю, как его решить.
Существует входная строка (например):Пытаться разобрать и заменить шаблон в Java с помощью regex

In software, a stack overflow [apple] occurs when too much memory [orange] is used on the call stack [banana]. 
The call stack [pear] contains a limited amount of memory, often determined at the start of the program [apple]. 

То, что я хотел бы сделать, это заменить слово [apple], [orange], [banana], [pear] к чему-то вроде <img src="apple.jpg">, <img src="orange.jpg">, <img src="banana.jpg">, <img src="pear.jpg">.
На самом деле, после почти 1 день, я узнал, регулярное выражение, которое может выяснить, шаблон, начиная с "[" и заканчиваться "]", который (?<=\\[)\\w+(?=])
Я не знаю, как хранить список слов ([Apple], [оранжевый]...).
Должен ли я использовать HashMap или ArrayList ??
И как выполнить петлю через HashMap и ArrayList для замены на соответствующую строку в «самое быстрое время»?

В этом примере список содержит только 4 вещи. Но на самом деле это может быть более 500 вещей в списке.
Хотя я обнаружил шаблон, я все еще не могу решить эту проблему, потому что я не знаю, как найти весь шаблон во входной строке, а затем узнать весь шаблон, а затем проверить, является ли этот шаблон в списке и затем замените правильную строку.
Обратите внимание, что в этом примере [apple] заменяет на <img src="apple.jpg">, но на самом деле xxx .jpg может быть не таким же в [xxx]. Но у меня есть список этого сопоставления.
Я действительно хочу решить эту проблему, пожалуйста, помогите мне решить и предоставить образец кодирования.
спасибо.

+0

Используйте 'HashMap '. – sircapsalot

+0

На самом деле, это первый раз, когда я использую регулярное выражение, я действительно не знаю, как его реализовать, можете ли вы привести пример? – jjLin

+0

Я воспользуюсь еще одним ответом на решение, используя RegEx, если вы застряли на этом. Возможно даже представить примеры времени – sircapsalot

ответ

1
String poem = "In software, a stack overflow [apple] occurs" 
    + " when too much memory [orange] is used on the call stack [banana]." 
    + " The call stack [pear] contains a limited amount of memory," 
    + " often determined at the start of the program [apple]."; 

Map<String, String> rep = new HashMap<String, String>(); 

rep.put("[apple]", "<img src='apple.jpg' />"); 
rep.put("[banana]", "<img src='banana.jpg' />"); 
rep.put("[orange]", "<img src='orange.jpg' />"); 
rep.put("[pear]", "<img src='pear.jpg' />"); 

for (Map.Entry<String, String> entry : rep.entrySet()) { 
    poem = poem.replace(entry.getKey(), entry.getValue()); 
} 

// poem now = what you want. 
+0

Вы имеете в виду 'poem = poem.replace (fruit, rep.get (fruit));'. – Keppil

+0

поймал его, как я выразился. спасибо :) – sircapsalot

+0

Хорошее решение, не нужно использовать регулярные выражения в этих простых случаях. +1. – Keppil

0

Если вы застряли на использовании регулярных выражений для выполнения этой задачи ...

String poem = "In software, a stack overflow [apple] occurs" 
       + " when too much memory [orange] is used on the call stack [banana]." 
       + " The call stack [pear] contains a limited amount of memory," 
       + " often determined at the start of the program [apple]."; 

     List<String> fruits = new ArrayList<String>(); 
     fruits.add("[apple]"); 
     fruits.add("[banana]"); 
     fruits.add("[pear]"); 
     fruits.add("[orange]"); 

     String pattern = "\\[(?<=\\[)(\\w+)(?=])\\]"; 
     poem = poem.replaceAll(pattern, "<img src='$1.jpg' />"); 

     System.out.println(poem); 

Вы можете увидеть this dynamic run кода.

+0

извините, что значит «$ 1.jpg» ($ 1). Как правильно заменить правильную строку? – jjLin

0

Я по-прежнему новичок в регулярном выражении, но я считаю, что вы хотите использовать группировку и шаблон и матчи для замены определенных частей матча.

Вы хотите сгруппировать свое регулярное выражение и заменить только «[» и «]» на соответствующий код.

String poem = "In software, a stack overflow [apple] occurs when too much memory [orange] is used on the call stack [banana]. The call stack [pear] contains a limited amount of memory, often determined at the start of the program [apple]."; 
Pattern p = Pattern.compile("(\\[)(\\w*)(\\])"); 
Matcher m = p.matcher(poem); 
poem = m.replaceAll("<img src='$2.jpg' />"); 

Это то, что я сделал, чтобы заставить его работать над вашим примером. Надеюсь, что это поможет (это помогло мне немного узнать регулярное выражение!).

+0

извините, что значит «$ 2.jpg» ($ 2) – jjLin

Смежные вопросы