Regex для сопоставления экранируемых строк?

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

(?>(?<Quote>""|').*?(?<!\\)\k<Quote>)

т. е. некоторый текст, заключенный в кавычки. Он также поддерживает экранирование, поэтому он будет соответствовать "hello\"world" в полном объеме, не останавливаясь на первой цитате, как я хочу. Но я забыл о двойном побеге. "hello\\"world" недействителен, например.

Я почти уверен, что это можно исправить с помощью балансировочных групп, но я никогда не использовал их раньше. Кто-нибудь знает, как написать это?

1 ответ

Решение

Регулярные выражения не предназначены для использования в экранированных конструкциях.

Я не думаю, что это возможно сделать каким-либо "хорошим" способом (если вообще), хотя я опубликую редактирование, если выясню иначе.

Определения балансировочной группы предназначены для вложенных конструкций. Вложение не происходит в строках, поэтому балансировка определений групп даже не подходит для этого.


Изменить 1:

Это зависит от того, сколько функций вы ищете. Если вы просто хотите сопоставить следующую экранированную цитату, вы можете использовать шаблон

^"([^\\\"]|\\.)*"

который, когда экранируется для кода, получается как

"^\"([^\\\\\\\"]|\\\\.)*\""

чтобы соответствовать что-то вроде

"Hello! \" Hi! \" "

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


Изменить 2:

Если вам все равно интересно, как работают определения балансировочных групп, я рекомендую прочитать страницу 430 этой книги (34 в формате pdf).

Другие вопросы по тегам