Подтвердить что ты не робот

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

Какие символы могут использоваться в качестве разделителей для регулярного выражения Perl? m/re/, m(re) и måreå все работают, но я хотел бы знать все возможности.

4b9b3361

Ответ 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.