POSIX, AFAIK, не поддерживает обходные пути - без этого на самом деле не существует способа сделать это с помощью только регулярных выражений. Однако, согласно имеющемуся у меня эмулятору POSIX (нет доступа к собственной среде или библиотеке), в некоторых случаях это может приблизить вас:
"[^\"]*"|"[^\]*\\|\\[^\"]*[\"]
будет захватывать часть до и часть после экранированной кавычки ... с этой исходной строкой (игнорируйте разрывы строк, представьте, что все в одной строке):
I want to match "this text" and "This text, where there is an escaped
slash (\\), and an \"escaped quote\" (\")", but I also want to handle\\ escaped
back-slashes, as in "this text, with a \\ backslash: \\" -- with a little
text behind it!
захватит эти группы:
"this text" -- simple, quoted string
"This text, where there is an escaped slash (\ -- part 1 of quoted string
\), and an \ -- part 2
"escaped quote\ -- part 3
" (\ -- part 4
")" -- part 5, and ends with a quote
\\ -- not part of a quoted string
"this text, with a \ -- part 1 of quoted string
\ backslash: \ -- part 2
\" -- part 3, and ends with a quote
При дальнейшем анализе вы можете комбинировать их в зависимости от ситуации:
- Если группа начинается и заканчивается символом
"
, то все в порядке
- Если группа начинается с
"
и заканчивается \
, то за ней следует НЕМЕДЛЕННО , за которой следует другая группа совпадений, которая либо заканчивается символом кавычки, либо рекурсивно продолжается НЕМЕДЛЕННО следовать за другой группой совпадений
- Если группа не сразу следует за другим совпадением, она не является частью строки в кавычках
Я думаю, что это весь анализ, который вам нужен, но не забудьте проверить его !!!
Дайте мне знать, если эта идея поможет!
EDIT:
Дополнительное примечание: просто для ясности, чтобы это работало, все кавычки во всей исходной строке должны быть экранированы, если они не должны использоваться в качестве разделителей, и обратные слеши также должны экранироваться везде