Regex для сопоставления экранируемых строк?
Я написал это регулярное выражение для соответствия строк:
(?>(?<Quote>""|').*?(?<!\\)\k<Quote>)
т. е. некоторый текст, заключенный в кавычки. Он также поддерживает экранирование, поэтому он будет соответствовать "hello\"world"
в полном объеме, не останавливаясь на первой цитате, как я хочу. Но я забыл о двойном побеге. "hello\\"world"
недействителен, например.
Я почти уверен, что это можно исправить с помощью балансировочных групп, но я никогда не использовал их раньше. Кто-нибудь знает, как написать это?
1 ответ
Регулярные выражения не предназначены для использования в экранированных конструкциях.
Я не думаю, что это возможно сделать каким-либо "хорошим" способом (если вообще), хотя я опубликую редактирование, если выясню иначе.
Определения балансировочной группы предназначены для вложенных конструкций. Вложение не происходит в строках, поэтому балансировка определений групп даже не подходит для этого.
Изменить 1:
Это зависит от того, сколько функций вы ищете. Если вы просто хотите сопоставить следующую экранированную цитату, вы можете использовать шаблон
^"([^\\\"]|\\.)*"
который, когда экранируется для кода, получается как
"^\"([^\\\\\\\"]|\\\\.)*\""
чтобы соответствовать что-то вроде
"Hello! \" Hi! \" "
но как только вы начинаете добавлять более сложные требования, такие как экранирование Юникода, это становится намного более утомительным. Просто сделайте это вручную, это должно быть намного проще.
Изменить 2:
Если вам все равно интересно, как работают определения балансировочных групп, я рекомендую прочитать страницу 430 этой книги (34 в формате pdf).