как использовать любое совпадение символов, за которым следует необязательный шаблон сопоставления? - PullRequest
3 голосов
/ 15 мая 2019

У меня есть этот вход, имя и имя_списка (, 10)

Мои требования

  • начало не должно быть пробелом
  • «имя» должно соответствовать любому символу (. +), Так как это может быть что угодно
  • '& cp_name' (необязательно)
  • '()' скобка внутри может быть что угодно (необязательно)

Примечание: все эти три могут быть разделены одним или несколькими пробелами

    (?P<field>[^\s].+?)\s*(?P<col>[&][a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?

Регулярное выражение, которое я пробовал в python Я ожидаю один матч с 3 захваченными группами

  • поле -> имя
  • col -> & cp_name
  • pos -> (, 10)

что я получу, 2 матча

1-й матч:

  • поле -> 'na'

2-й матч:

  • поле -> «я»
  • col -> '& cp_name'
  • pos -> '(, 10)'

1 Ответ

0 голосов
/ 15 мая 2019

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

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

^(?P<field>(?![^\s&]*&)\S+(?: (?!\([^)]*\)|[^&\s]*&)\S+)*)\s*(?P<col>&[a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?$
  • ^ Начало строки
  • (?P<field> Поле именованной группы
    • (?![^\s&]*&)\S+ Утверждение того, что справа не содержит &, затем соответствует 1+ раз непробельному символу
    • [^\s&]\S+ совпадение не с пробельным символом или & с последующим сопоставлением 1+ раз с непробельным символом
    • (?: группа без захвата
      • (?!\([^)]*\))\S+ Утвердить, чтосправа не является ( ... ), затем соответствует 1+ раз непробельному символу
    • )* Закройте группу без захвата и повторите 0+ раз
  • ) Закрыть поле группы
  • \s*(?P<col>&[a-zA-Z_]+)? Соответствовать необязательно col группа
  • \s*(?P<pos>\(.*?\))? Соответствовать необязательно pos группа

Regex demo

Обратите внимание, что вы можете опустить квадратные скобки вокруг [&]

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