Как извлечь слова в фигурные скобки с помощью регулярных выражений? - PullRequest
3 голосов
/ 10 сентября 2010

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

foo {bar} moo {mar}

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

Моя попытка

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

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

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

Результат

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

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

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

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

  • .* совпадений foo
  • \{({GROUP}\w+)\} совпадений {bar}
  • .* совпадений moo {mar}

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

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

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

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

2 голосов
/ 10 сентября 2010

Вариант с использованием модификатора реактивности ". *?"в регулярном выражении.Вы можете найти дополнительную информацию о стратегии поиска регулярного выражения (жадный, неохотный, притяжательный) здесь: 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's.Персонально, я предпочитаю использовать неохотный поиск, а не исключение символов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...