2013-02-27 2 views
0

Мне нужно извлечь подстроки из строки:Нужна помощь в выяснить правильное регулярное выражение

Учитывая строку: "< If((h == v)): { [ < j = (i - f) ;>, < k = (g + t) ;> ] }>" мне нужны две подстроки: "j = (i - f)" и "k = (g + t)".

Для этого я попробовал регулярное выражение пользовательского шаблона. Вот мой код:

Pattern pattern = Pattern.compile("[<*;>]"); 
Matcher matcher = pattern.matcher(out.get(i).toString()); 
while (matcher.find()) 
    { 
     B2.add(matcher.group()); 
     } 

out.get (i) .toString() - это моя строка ввода. B2 является ArrayList, который будет содержать две извлеченные подстроки.

Но, после выполнения вышеуказанного кода, выход, который я получаю: [<, <, ;, >, <, ;, >, >].

My pattern не работает! Ваша помощь очень ценится. Спасибо заранее!

+1

Попробуйте этот сайт http://www.regexplanet.com/ – Elmer

+0

Одна проблема заключается в том, что '[...]' не означает, что вы думаете, что он делает. Это обозначение для * символьного класса *, такого, что (например) '[abc]' означает «a», «b» или «c'». – ruakh

ответ

1

вы можете использовать выражение <([^<]+);>.

Это будет соответствовать вещи между < и;>

Pattern pattern = Pattern.compile("<([^<]+);>"); 
Matcher matcher = pattern.matcher(out.get(i).toString()); 
while (matcher.find()) 
    { 
     B2.add(matcher.group(1)); 
     } 

Вы можете увидеть результаты на regexplanet: http://fiddle.re/5rty6

+0

Спасибо большое! Это работает! – kajarigd

0

Ваши [ и ] вызывают у вас проблемы. эти символы означают: "match one among the symbols inside of these" Если вы удалите их, вы получите лучшие результаты. Когда вы это сделаете, вам также придется избегать ваших заостренных скобок.

Следующим шагом будет захват групп. вы обычно используете ( и ).

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

Вы могли бы закончить с

"\<([^<>]*?)\>" 

как ваше регулярное выражение. Обязательно проверьте соответствующую документацию Java и избежать вашего \ для окончательного результата

"\\<([^<>]*?)\\>" 

Если Вы желаете, чтобы рядом с другим < и > внутри ваши заостренными скобок, регулярное выражение имеет много проблем с таким родом вещи, и, возможно, вы должны попробовать другой метод

Here's a sample regex

+0

Большое спасибо за ваш ответ! Это очень полезно! – kajarigd

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