std и plus правлены мною.
Насчёт моего утверждение, что plus не съест пустые кавычки — я был не прав. Извините. Это всё моя невнимательность… Остальное вроде так как и говорил.
И кстати, выше я предлагал выражение "((?>[^"\\]*|\\.)*)". Тут грубейшая ошибка!) Думаю сами догадались какая :)
извините, но выражение по вашей ссылке на мой субъективный взгляд некорректны :)
1) std
сохраняющие скобки захватывают не то что надо, +атомарная группировка и квантификатор должны немного улучшить дело :)
"((?>[^"\\]*|\\.)*)" — так мне кажется корректней. По идее и быстрее. Извините, щас проверить не могу, нет ничего под рукой…
2) lazy
"(.*?)(?<!\\)"
Как я понял он некорректен при выражении вида \\"
У lazy_2 та же проблема.
3) plus
не съест найдёт пустый строки ""
Получается только unroll валидный для отловки текста между двумя кавычками :) В нём вроде как всё выглядит нормально. По крайней мере на первый взгляд :)
Щас будем думать как и его улучшить. :)
Ещё бы к важным я причислил управление компиляцией… интерполюцией… предварительным копированием…
Очень часто полезно применение атомарные группировки…
Вообще, не зная принципов работы НКА не стоит даже пытаться что-либо оптимизировать. Особенно в работе с квантификаторами :) Велик шанс того, что эффект будет обратным. Либо вообще измените результат работы патерна.
Я всегда думал что поддержка различных ограничителей производится на уровне конкретного языка(к примеру Perl). Разве она осуществляется на уровне патернов???
Насчёт моего утверждение, что plus не съест пустые кавычки — я был не прав. Извините. Это всё моя невнимательность… Остальное вроде так как и говорил.
И кстати, выше я предлагал выражение "((?>[^"\\]*|\\.)*)". Тут грубейшая ошибка!) Думаю сами догадались какая :)
print "$str\n\n";
print «1) lazy2 < $1 >\n» while $str =~ m/"(.*?)"(?<!\\")/g;
print «2) plus < $1 >\n» while $str =~ m/"(([^"\\]+|\\.)*)"/g;
print «3) std < $1 >\n» while $str =~ m/"((?>[^"\\]+|\\.)*)"/g;
print «4) lazy < $1 >\n» while $str =~ m/"(.*?)(?<!\\)"/g;
print «5) unroll < $1 >\n» while $str =~ m/"([^"\\]*(?:\\.[^"\\]*)*)"/g;
print «6) ??? < $1 >\n» while $str =~ m/"(.*?)"(?<! \\")/g;
cb «zero \» one\\" two \\\" free \\\\" four \\\\\" no!"
1) lazy2 < zero \" one\\" two \\\" free \\\\" four \\\\\" no! >
2) plus < zero \" one\\ >
2) plus < free \\\\ >
2) plus < no! >
3) std < zero \" one\\ >
3) std < free \\\\ >
3) std < no! >
4) lazy < zero \" one\\" two \\\" free \\\\" four \\\\\" no! >
5) unroll < zero \" one\\ >
5) unroll < free \\\\ >
5) unroll < no! >
6) ??? < zero \" one\\ >
6) ??? < free \\\\ >
6) ??? < no! >
Однако можно извратиться и снова получить инъекцию в split /$input:/
:)
1) std
сохраняющие скобки захватывают не то что надо, +атомарная группировка и квантификатор должны немного улучшить дело :)
"((?>[^"\\]*|\\.)*)" — так мне кажется корректней. По идее и быстрее. Извините, щас проверить не могу, нет ничего под рукой…
2) lazy
"(.*?)(?<!\\)"
Как я понял он некорректен при выражении вида \\"
У lazy_2 та же проблема.
3) plus
не съест найдёт пустый строки ""
Получается только unroll валидный для отловки текста между двумя кавычками :) В нём вроде как всё выглядит нормально. По крайней мере на первый взгляд :)
Щас будем думать как и его улучшить. :)
Ниже промазал, извините :)
Очень часто полезно применение атомарные группировки…
Вообще, не зная принципов работы НКА не стоит даже пытаться что-либо оптимизировать. Особенно в работе с квантификаторами :) Велик шанс того, что эффект будет обратным. Либо вообще измените результат работы патерна.
В большинстве случаев \w поддерживает юникод и там не только латинские буквы!