Java Regex: захват нескольких совпадений в одной строке - PullRequest
3 голосов
/ 05 марта 2020

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

([a-z][a-zA-Z0-9-]*)=(('(\'|[^\'])*')|("(\"|[^"])*"))

Например, если в качестве входных данных используется следующая строка:

a="xyz" b="hello world"

И используется следующий код:

Matcher matcher = rules.get(regex).matcher(input);
int start = 0;

while (matcher.find(start)) {
    System.err.println(matcher.group(0));

    start = matcher.end();
}

Он должен дать мне два отдельных результата:

1. a="xyz"
2. b="hello world"

Но он возвращает только один, всю входную строку.

a="xyz" b="hello world"

Кажется, он принимает xyz" b="hello world в качестве внутреннего часть. Как я могу решить эту проблему?

1 Ответ

2 голосов
/ 05 марта 2020

Вы можете использовать

(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")

См. Демоверсию regex

In Java,

String regex = "(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\\\']*(?:\\\\.[^\\\\']*)*)'|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")";

Подробности

  • (?s) - встроенный Pattern.DOTALL встроенный параметр флага, соответствующий . совпадению с символами разрыва строки
  • ([a-z][a-zA-Z0-9-]*) - группа 1
  • = - знак равенства
  • (?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)") - группа без захвата, соответствующая одной из двух альтернатив:
    • '([^\\']*(?:\\.[^\\']*)*)' - ', затем любое количество символов, другое чем \ и ', за которыми следуют 0+ повторений любой escape-последовательности, за которыми следуют 0+ символов, отличных от \ и '
    • | - или
    • "([^"\\]*(?:\\.[^"\\]*)*)" - ", затем любое количество символов, отличных от \ и ", за которыми следует 0+ повторений любой escape-последовательности, за которыми следуют 0+ символов, отличных от \ и ".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...