Какие символы могут использоваться в качестве разделителей для регулярного выражения Perl? m/re/
, m(re)
и måreå
все работают, но я хотел бы знать все возможности.
Какие символы могут использоваться в качестве разделителей регулярных выражений?
Ответ 1
Из perlop
:
С помощью m вы можете использовать любую пару символов без пробелов в качестве разделителей.
Итак, все идет, кроме пробелов. Полный абзац для этого:
Если "/" является разделителем, тогда начальное значение m является необязательным. С помощью m вы можете использовать любую пару символов без пробелов в качестве разделителей. Это особенно полезно для сопоставления имен путей, содержащих "/", чтобы избежать LTS (синдром наклона зуба). Если "?" является разделителем, тогда правило только для единообразия? PATTERN? применяется. Если "'" является разделителем, интерполяция не выполняется в PATTERN. При использовании символа, действительного в идентификаторе, требуется пробел после m.
Ответ 2
Как это часто бывает, мне интересно: "Могу ли я написать программу Perl для ответа на этот вопрос?".
Вот довольно хорошее первое приближение к попыткам всех печатаемых символов ASCII:
#!/usr/bin/perl
use warnings;
use strict;
$_ = 'foo bar'; # something to match against
foreach my $ascii (32 .. 126) {
my $delim = chr $ascii;
next if $delim eq '?'; # avoid fatal error
foreach my $m ('m', 'm ') { # with and without space after "m"
my $code = $m . $delim . '(\w+)' . $delim . ';';
# print "$code\n";
my $match;
{
no warnings 'syntax';
($match) = eval $code;
}
print "[$delim] didn't compile with $m$delim$delim\n" if [email protected];
if (defined $match and $match ne 'foo') {
print "[$delim] didn't match correctly ($match)\n";
}
}
}
Ответ 3
Можно использовать любой символ без пробелов, хотя символы идентификатора должны быть отделены от начального m пробелом. Хотя, когда вы используете одиночную цитату в качестве разделителя, она отключает интерполяцию и большинство обратных слэшей.
Ответ 4
В лексике есть ошибка, которая иногда запрещает использование символов UTF-8 в качестве разделителя, даже если вы можете прокрасться латиницей 1, если вы не находитесь в полном режиме Unicode.