Отрицание обратной ссылки в регулярном выражении - PullRequest
0 голосов
/ 21 февраля 2019

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

(?<arg>(?<key>\w+)+=(?<quote>["'`])(?<value>(?:[^\k<quote>]|(?<=\\)\k<quote>)+\k<quote>))

, но оно не работает из-за обратных ссылок внутри [^].Я искал решение по этой теме и написал следующее:

(?<arg>(?<key>\w+)+=(?<quote>["'`])(?<value>(?:(?!\k<quote>).|(?<=\\)\k<quote>)+\k<quote>))

однако оно все еще не работает.

Что я делаю не так?

Я хочу извлечь все ключи со значениями из строк, таких как:

arg="value" arg='value' arg=`value` arg="value 'value'" arg='value \'value\' value' arg="value \"value\" value" arg=`value \`value\ value`

regex101 - предварительный просмотр в режиме онлайн

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете исправить регулярное выражение, используя правильный жадный жетон :

(?<arg>               # Start arg group
  (?<key>\w+)         #  key group: 1+ word chars
  =                   # =
  (?<quote>['"`]?)    # quote group: an optional " ' or `
  (?<value>(?:(?!\k<quote>)[^\\])*(?:\\[\s\S](?:(?!\k<quote>)[^\\])*)*) # value group: any 0+ chars other than quote char with escaped quote chars allowed
  \k<quote>           # quote group value
)                     # end of arg group

См. Демонстрационную версию регулярного выражения .

Однострочник:

(?<arg>(?<key>\w+)=(?<quote>['"`]?)(?<value>(?:(?!\k<quote>)[^\\])*(?:\\[\s\S](?:(?!\k<quote>)[^\\])*)*)\k<quote>)

См. Демоверсию .

...