Ожидайте разделитель, только если две другие группы были удовлетворены - PullRequest
0 голосов
/ 05 ноября 2019

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

"a"   < Match group 1
"b"   < Match group 3
"a-b" < Match group 1, 2 and 3
"-"   < No match
"ab"  < No match

Я пытался создать что-то вроде (a?)(-b?), но, очевидно, это не работает так, как я хочу.

Редактировать:

Используя реальный пример, чтобы объяснить лучше:

Regex Я пытался использовать: /remind (me|him)? about (this|that)?/gm

 Text                   | Should match?
"remind me"             | Yes
"remind me about this"  | Yes
"remind me about that"  | Yes
"remind me about error" | No
"remind him about this" | Yes
"remind about"          | NO
"remind this"           | Yes
"remind error"          | No
"remind me"             | Yes

Редактировать объясняя причину:

Мне нужно это регулярное выражение, чтобы разделить данные по полям, например "Кто будет напоминать?"«Что такое текст напоминания?»

remind me about this
Человек: я
Вещь: это

remind me
Человек: я
Вещь: отсутствует

remind that
Персона: отсутствует
Вещь: что

remind me this
Ошибка

remind about this
Ошибка

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

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

Используется сброс ветви. Person находится в группе 1, Thing находится в группе 2.
Если какой-либо из них отсутствует, это означает, что его там нет.

remind[ ](?|(him)[ ]about[ ](this)|(me)(?:[ ]about[ ](th(?:at|is)))?|()(th(?:at|is)))

https://regex101.com/r/DPfvs0/1


Если сброс ветви недоступен, группы захвата могут быть спарены как
с шагом 2, т. е. человек / вещь.
1 & 2
3 & 4
5 & 6

Просто посмотрите, какая пара соответствует.

remind[ ](?:(him)[ ]about[ ](this)|(me)(?:[ ]about[ ](th(?:at|is)))?|()(th(?:at|is)))

https://regex101.com/r/xJUFbQ/1

0 голосов
/ 06 ноября 2019

Не совсем уверен, но, возможно, это помогает. По крайней мере, он удовлетворяет вашим требованиям: соответствует "a", "b", "ab" и не соответствует ab и ba.

((a)-(b))|(?:\b(a)(?:[^b]|\b))|(?:(?:[^a]|\b))(b)\b

https://regex101.com/r/YOa83X/1/

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