2010-09-10 2 views
3

Я хочу, чтобы извлечь все слов, заключенные в фигурных скобках, поэтому у меня есть такие выражения, как этотКак извлечь слова в фигурных скобках, используя регулярные выражения?

foo {bar} moo {mar} 

Строка для соответствия может иметь любое количество этих слов, но я начинаю думать, что я m приближается к этой проблеме неправильно.

Моя попытка

И я попытался извлечь слова скреплений на группы, так что я могу использовать каждый матч. Таким образом, я сделал регулярное выражение:

String rx = ".*\\{({GROUP}\\w+)\\}.*"; 

Примечания: Я использую синтаксис JRegex так что мне нужно, чтобы избежать некоторых из фигурной скобки.

Результат

В результате я получаю один (хотя и правильно) матч bar, в то время как я ожидаю два матча bar и mar. Что я неправильно понял и как его исправить? Вероятно, мне нужно использовать какой-то другой квантификатор для части ., но я надеюсь, что вы тоже можете мне помочь.

Большое спасибо заранее!

+0

Может ли скобки быть вложенными? – MAK

ответ

5

Ваше регулярное выражение .*\{({GROUP}\w+)\}.* не работает, потому что он соответствует все ваши строки ввода в одно время:

  • .* спичек foo
  • \{({GROUP}\w+)\} спичек {bar}
  • .* спичек moo {mar}

You должен использовать что-то вроде этого:

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{([^}]*)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) 
{ 
    matchList.add(regexMatcher.group()); 
} 

Внутренние фигурные скобки не обрабатываются этим регулярным выражением

+3

"(? <= \\ {) ([^}] *) (? = \\})" regex должен давать вам слова без привязок вокруг них. – ScArcher2

+0

Отлично, это решило! – Nubsis

2

вариант, используя неохотой модификатор "*?" в выражении регулярного выражения. Вы можете найти additionnal информацию о стратегии поиска регулярного выражения (жадный, не желая, притяжательные) здесь: http://javascript.about.com/library/blre09.htm

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{(.*?)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

Выбор синтаксиса вами. Это регулярное выражение будет иметь тот же комплетмент, что и @ madgnome. Personnaly, я предпочитаю использовать неохотный поиск, а не исключение символов ...

+0

Спасибо, это было хорошо читать. Ура! – Nubsis

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