Получить группу между необязательными группами - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь сопоставить группу, в которой есть только «Джек» в предложениях ниже. Я хотел бы сделать регулярное выражение, которое получает что-либо после слова "привет" и после или перед строкой "мой друг".

Greetings, hello my friend Jack
Greetings, hello Jack my friend
Greetings, hello Jack

Не работает следующее:

val test = new Regex("(.*)? (.|,) (hello|hey)? (my friend )?(\\S.*)?(?= my friend))

Любой совет о том, как расположить какую-то группу между необязательными группами, был бы полезен.

1 Ответ

0 голосов
/ 10 сентября 2018

Шаблон .* использует всю строку, поэтому, когда он пытается соответствовать шаблону точка или запятая, не остается ничего, с чем можно было бы совпасть. Это связано с тем, что оператор * является жадным : он глотает столько, сколько может.

Для этого есть два простых решения:

  1. Используйте ленивый вариант (.*?)?, который потребляет столько символов, сколько необходимо, чтобы все еще соответствовать тому, что будет впереди.

  2. Вместо использования . для сопоставления со всеми, используйте отрицательный класс символов для сопоставления «все, кроме того, что впереди». В вашем примере все, кроме запятой или точки: ([^.,]*)?

Вы можете прочитать об этом в этом уроке .

Есть и другие проблемы с вашим регулярным выражением. Например, точка во второй группе будет соответствовать любому символу (что делает выбор |, избыточным).

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