Regex для сопоставления экранируемых строк? - PullRequest
1 голос
/ 11 мая 2011

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

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

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

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

1 Ответ

1 голос
/ 11 мая 2011

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

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

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


Редактировать 1:

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

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

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

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

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

"Hello! \" Hi! \" "

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


Редактировать 2:

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

...