Они все действительно хороши, записаны академия , и (некоторые) книги (неопубликованная книга oreilly - переведенный из французского языка, но никакие проблемы я нашел), например). У меня есть *'d мои любимые, которые помогли мне больше всего.
ocaml:
Haskell:
Для большинства строк вам нужно разрешить экранированному все что угодно (не только экранированные кавычки). например вам, скорее всего, нужно разрешить экранированные символы, такие как "\n"
и "\t"
и, конечно, экранированный экранирование: "\\"
.
Это часто задаваемый вопрос, который был решен (и оптимизирован) давно. Джеффри Фридл подробно рассматривает этот вопрос (в качестве примера) в своей классической работе: Освоение регулярных выражений (3-е издание) . Вот регулярное выражение, которое вы ищете:
"([^"\\]|\\.)*"
Версия 1: работает правильно, но не очень эффективно.
"([^"\\]++|\\.)*"
или "((?>[^"\\]+)|\\.)*"
Версия 2: Более эффективно, если у вас есть собственнические квантификаторы или атомные группы (см .: правильный ответ греха, который использует метод атомной группы) .
"[^"\\]*(?:\\.[^"\\]*)*"
Версия 3: еще более эффективный. Реализует метод Фридля: «развернуть петлю» . Не требует притяжательных или атомарных групп (то есть это может использоваться в Javascript и других менее функциональных механизмах регулярных выражений.)
Вот рекомендуемые регулярные выражения в синтаксисе PHP как для двойных, так и для одинарных кавычек:
$re_dq = '/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';
$re_sq = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/s";
Это оставит кавычки за пределами
(?<=['"])(.*?)(?=["'])
и использование global
/ g будет соответствовать всем группам