Это сильно варьируется от одного вкуса к регулярному выражению до следующего. Например, JavaScript позволяет использовать только косую черту (или солидус) в качестве разделителя для литералов регулярных выражений, но в Perl вы можете использовать практически любой знак пунктуации, включая, в более поздних версиях, символы не ASCII, такие как «
и »
. Когда вы используете символы, которые входят в сбалансированные пары, такие как фигурные скобки, скобки или кавычки с двумя стрелками выше, они должны быть правильно сбалансированы:
m«\d+»
s{foo}{bar}
Ruby также позволяет вам выбирать разные разделители, если вы используете префикс %r
, но я не знаю, распространяется ли это на сбалансированные разделители или символы, не входящие в ASCII. Многие языки вообще не поддерживают литералы регулярных выражений; вы просто пишете регулярные выражения в виде строковых литералов, например:
r'\d+' // Python
@"\d+" // C#
"\\d+" // Java
Обратите внимание на двойную обратную косую черту в версии Java. Это необходимо, потому что строка обрабатывается дважды: один раз компилятором Java и один раз методом compile()
класса Pattern. Большинство других языков предоставляют «сырой» или «дословный» вид строкового литерала, который почти исключает такую обратную косую черту.
И, наконец, PHP. Его preg
функции регулярных выражений построены на основе библиотеки PCRE, которая близко имитирует регулярные выражения Perl, включая широкий спектр разделителей. Однако сам PHP не поддерживает литералы регулярных выражений, поэтому вы должны писать их так, как если бы они были литералами регулярных выражений, встроенными в строковые литералы, например:
'/\d+/g' // match modifiers go after the slash but inside the quotes
"{\\d+}" // double-quotes may or may not require double backslashes
Наконец, обратите внимание, что даже те языки, которые поддерживают литералы регулярных выражений, обычно не предлагают ничего подобного конструкции s/…/…/
в Perl. Ближайшим эквивалентом является вызов функции, который принимает литерал регулярного выражения в качестве первого аргумента и строковый литерал в качестве второго, например:
s = s.replace(/foo/i, 'bar') // JavaScript
s.gsub!(/foo/i, "bar") // Ruby