Regex: Как запечатлеть это? (вложенная группа внутри повторяющейся группы) - PullRequest
6 голосов
/ 10 ноября 2011

Как я могу решить эту проблему с Java regex?

Введите:

some heading text... ["fds afsa","fwr23423","42df f","1a_4(211@#","3240acg!g"] some trailing text....

Проблема: я хотел бы захватить все между двойными кавычками. (Пример: fds afsa, fwr23423 и т. Д.)

Я пробовал следующий шаблон:

\[(?:"([^"]+)",?)+\]

Но при выполнении Matcher.find () это приведет к StackOverflowError, когда используется больший ввод (но он работает для небольшого ввода, это ошибка в Java). И даже если это сработало, matcher.group (1) выдаст только «3240acg! G».

Как я могу решить эту проблему? (Или требуется использование нескольких шаблонов, когда первый шаблон снимает скобки?)

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Три предложения:

Если между скобками могут встречаться только строки, то вам вообще не нужно их проверять, просто используйте "[^"]*" в качестве регулярного выражения и найдите все совпадения (при условии, что кавычек не было).

Если это не сработает, потому что строки могут возникать и в других местах, где вы не хотите их захватывать, сделайте это в два шага.

  1. Совпадение \[[^\]]*\].
  2. Найти все вхождения "[^"]*" в результате первого совпадения. Или даже используйте анализатор JSON для чтения этой строки.

Третья возможность, немного изменяю:

Поиск "[^"\[\]]*"(?=[^\[\]]*\]). Это будет соответствовать строке, только если следующая следующая скобка является закрывающей скобкой. Ограничение: скобки не допускаются внутри строк. Я считаю это уродливым, особенно если вы посмотрите, как это будет выглядеть в Java:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

Как вы думаете, кто-нибудь, кто смотрит на это через несколько месяцев, может сказать, что он делает?

1 голос
/ 10 ноября 2011

Получить строку между [ ] и затем разделить запятой.Это намного проще.

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