как сделать переносимое регулярное выражение? - PullRequest
4 голосов
/ 16 мая 2010

Какие функции регулярных выражений являются стандартными, а какие уникальными?
Что я должен делать, а не делать, если я хочу использовать одно и то же регулярное выражение в разных контекстах, языках, платформах?

Ответы [ 2 ]

4 голосов
/ 16 мая 2010

Стандартов нет, но если ваша цель - максимальная переносимость, вам следует придерживаться функций, поддерживаемых регулярными выражениями JavaScript. Все остальные основные разновидности поддерживают все, что делает JS, с небольшими изменениями здесь и там. Например, некоторые поддерживают только нотацию класса символов POSIX ([:alpha:]), в то время как другие используют синтаксис Unicode (\p{Alpha}).

Вероятно, наиболее проблемные варианты - это те, которые влияют на точку (.) и якоря (^ и $). Например, JavaScript не имеет режима DOTALL (или «однострочный»), поэтому для сопоставления с чем угодно , включая символ новой строки , необходимо использовать хак, например [\s\S]. Между тем, в Ruby есть режим DOTALL, но он называется многострочным режимом - то, что каждый else называет «многострочным» (^ и $ как якоря строк), - это то, как Ruby всегда работает .

Также следует учитывать, что точка не совпадает (в режиме по умолчанию). Традиционно это был просто перевод строки (\n), но все больше и больше вкусов принимают (или, по крайней мере, приближаются) к руководству Unicode относительно разделителей строк. Например, в Java точка не соответствует ни одному из [\r\n\u0085\u2028\u2029], тогда как ^ и $ обрабатывают \r\n как один разделитель и не будут совпадать между двумя символами.

Обратите внимание, что я говорю только о производных от Perl разновидностях, таких как Python, Ruby, PHP, JavaScript и т. Д. Не имеет смысла включать GNU или POSIX-основанные разновидности, такие как grep, awk и MySQL; у них, как правило, меньше функций, но это не то, для чего вы бы их выбрали.

Я также не включаю разновидность XML-схемы; он намного более ограничен, чем JavaScript, но это специализированное приложение. Например, он не поддерживает якоря (^, $, \A, \Z и т. Д.), Поскольку совпадения всегда привязываются с обоих концов.

1 голос
/ 16 мая 2010

Здесь вы можете найти хорошую ссылку . И вот у вас есть лучшая книга , которую я когда-либо читал на эту тему. Затем на этой странице , под языковыми функциями (часть 1 и 2) вы можете увидеть некоторые различия

...