Отрицание обратной ссылки в регулярном выражении
Я написал такое регулярное выражение:
(?<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`
1 ответ
Решение
Вы можете исправить регулярное выражение, используя правильный жадный жетон:
(?<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>)
Смотрите демо.