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

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

Ответы [ 4 ]

23 голосов
/ 24 апреля 2011

С perlop:

С помощью m вы можете использовать любую пару непробельных символов в качестве разделителей.

Так что все идет, кроме пробелов. Полный абзац для этого:

Если «/» является разделителем, то начальный m не обязателен. С m вы можете использовать любую пару непробельных символов в качестве разделителей. Это особенно полезно для сопоставления имен путей, которые содержат «/», чтобы избежать LTS (синдром наклоняющейся зубочистки). Если "?" является разделителем, а затем правилом «только один раз»? PATTERN? применяется. Если «» является разделителем, никакая интерполяция не выполняется для ШАБЛОНА. При использовании символа, допустимого в идентификаторе, после m требуется пробел.

5 голосов
/ 24 апреля 2011

Как часто бывает, мне интересно, "могу ли я написать 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 $@;
        if (defined $match and $match ne 'foo') {
            print "[$delim] didn't match correctly ($match)\n";
        }
    }
}
4 голосов
/ 24 апреля 2011

Можно использовать практически любой непробельный символ, хотя идентифицирующие символы должны отделяться от начального m пробельными символами.Хотя, когда вы используете одинарную кавычку в качестве разделителя, она отключает интерполяцию и экранирование от обратной косой черты.

3 голосов
/ 24 апреля 2011

В настоящее время в лексере есть ошибка, которая иногда не позволяет использовать символы UTF-8 в качестве разделителя, даже если вы можете использовать его для Latin1, если вы не в полном режиме Unicode.

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