Открывающие и закрывающие символы регулярного выражения - PullRequest
0 голосов
/ 01 ноября 2009

Когда я выучил регулярные выражения, я понял, что они должны начинаться и заканчиваться символом косой черты (за которым следует модификатор).

Например / собака / я

Однако во многих примерах я вижу, что они начинаются и заканчиваются другими символами, такими как @, # и |.

Например | собака |

Какая разница?

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Это сильно варьируется от одного вкуса к регулярному выражению до следующего. Например, 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
4 голосов
/ 01 ноября 2009

Некоторые движки RE позволяют вам использовать другой символ, чтобы избежать необходимости экранировать эти символы при использовании в RE.

Например, с sed вы можете использовать любой из:

sed 's/\/path\/to\/directory/xx/g'
sed 's?/path/to/directory?xx?g'

Последнее часто более читабельно. Первую иногда называют «наклоняющимися зубочистками». С Perl вы можете использовать любой из:

$x =~ /#!\/usr\/bin\/perl/;
$x =~ m!#\!/usr/bin/perl!;

но я все еще утверждаю, что последнее легче для глаз, тем более что RE становятся очень сложными. Ну, так же просто, как любой код Perl может быть: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...