Применять позитивный взгляд только в том случае, если была найдена группа захвата - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь создать регулярное выражение, которое соответствует строкам (в C #).Это тест, который я пытаюсь выполнить:

"bla\"" => matches "bla\""
"bla\" => no matches
@"bla\" => matches @"bla\" 
@"bla\"" => matches only @"bla\"

То есть, если символ @ предшествует кавычке, регулярное выражение игнорирует управляющий символ (\).

Мое регулярное выражениевот так:

^@?(["'])(?:(?=(\\?))\2.)+?\1$

Моя единственная проблема - распознать символ @ и иметь дело с управляющим символом ...

Есть идеи?

1 Ответ

0 голосов
/ 15 октября 2018

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

^@(["']).*?\1|^(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2

https://regex101.com/r/BvcLJB/3

Общая идея заключается в чередовании (сопоставление @ и продолжение до тех пор, пока начальный разделитель не будет найден снова) и (сопоставлениеначальный разделитель и продолжается до тех пор, пока снова не будет найден неэкранированный разделитель.повторять до тех пор, пока начальный разделитель не будет найден снова

и

  • ^(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2:
    • ^(["'])(?: - сопоставить начальный разделитель, затем группу из:
      • \\\2 - экранированный начальный разделитель или
      • (?!\\\2)(?!\2). - любой символ, который не является началом экранированного начального разделителя, или любой символ, которыйявляется неэкранированным разделителем
    • )*\2 Повторяйте предыдущую группу, пока не достигнете начального разделителя снова

Поскольку имеетсябыло некоторое обсуждение в комментариях по этому поводу, большая повторная группа во втором альтЗначение можно повторять лениво, если хотите (заканчивайте )*?\2 вместо )*\2), что может уменьшить количество шагов, необходимых для некоторых строк, но это не обязательно.

...