Соответствующий символ, если он присутствует, в противном случае продолжить - PullRequest
1 голос
/ 07 мая 2020

Демо: https://regex101.com/r/5EVbAJ/1

У меня есть это регулярное выражение:

a.+?(W)?.*?(\d)

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

Мои тестовые данные:

1. a,W1
2. a W1
3. a,W 1
4. a, V1

5. a, W1 //fail

1-3 работают, потому что между a и W (я считаю, что это из-за ленивого оператора +?). 4 работает, потому что сопоставление W не требуется.

Но 5 не работает: группа номеров сопоставлена ​​правильно, но группа W пуста, хотя W встречается с двумя символами между a и W.

Как исправить?

1 Ответ

1 голос
/ 07 мая 2020

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

a(?:.+?(W))?.*?(\d)

Здесь хитрость заключается в том, чтобы использовать группу без захвата вокруг части шаблона .+(W), чтобы механизм регулярных выражений соответствовал этому шаблону хотя бы один раз. Это означает, что (W) является обязательным шаблоном, и поэтому Группа 1 будет заполнена, если он W присутствует после любого 1 или более символов, кроме символов разрыва строки после a.

Dart test :

final regex = RegExp(r'a(?:.+?(W))?.*?(\d)');
Iterable<Match> matches = regex.allMatches("5. a, W1");
for (Match match in matches) {
    print(match.group(1)); // => W
    print(match.group(2)); // => 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...