Regex для сопоставления строк, но также есть необязательные групповые совпадения - PullRequest
3 голосов
/ 21 сентября 2019

У меня есть следующая строка:

  • Меня зовут Марк, я живу в столице Испании и мне нравится программировать на компьютере

Я ожидаю, что группыбыть:

  • G1: Марка
  • G2: Испания
  • G3: компьютеры

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

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

  • Меня зовут Марк, я живу в столице Испании, и мне нравится программирование на компьютерах

  • Меня зовут Марк, я живу в столице Испании, и мне нравятся компьютеры

  • Меня зовут Марк и я живу в столице Испании

  • Меня зовут Марк и я живу в Испании

До сих пор я использовал следующее регулярное выражение:

My name is '([^']+?)' and I live in ([^']+?)(?: capital|)(?: and I like ([^']+?)|)(?: programming| reading|)

Я использую его в SpecFlow для целей автоматизации, и ОНО РАБОТАЕТ, но когда я использую его в любом тесте регулярных выраженийэто выглядит не очень хорошо: https://regex101.com/r/Ro0rHP/1

Кроме того, это как-то делает интеграцию пользовательского интерфейса между Visual Studio 2019 и SpecFlow некорректно для следующих шагов после этого.

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

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Выражение типа (?: capital|) лучше написано (?: capital)?.

Я бы использовал:

My name is '([^']+)' and I live in (\S+)(?: capital)?(?: and I like (\S+))?(?: programming| reading)?

Объяснение:

My name is                  # literally
'([^']+)'                   # group 1, 1 or more non quote between quotes
and I live in               # literally
(\S+)                       # group 2, 1 or more non space
(?: capital)?               # non capture group, optional
(?:                         # non capture group
    and I like              # literally
    (\S+)                   # group 3, 1 or more non space
)?                          # end group, optional
(?: programming| reading)?  # non capture group, optional

Демо

0 голосов
/ 21 сентября 2019

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

My name is '([^']+)' and I live in (.+?)(?:$| capital$| capital and I like (.+?)(?: programming|$))

Если вы хотите упростить / изменить / изучить выражение, это было объясненона верхней правой панели regex101.com .При желании вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...