哪些字符可以用作正则表达式分隔符?

Tim*_*Tim 18 regex unicode perl

哪些字符可以用作Perl正则表达式的分隔符?m/re/,m(re)并且måreå似乎都工作,但我想知道所有的可能性.

Mat*_*Mat 23

来自perlop:

使用m,您可以使用任何一对非空白字符作为分隔符.

所以任何事情都会发生,除了空白.完整的段落是:

如果"/"是分隔符,则初始m是可选的.使用m,您可以使用任何一对非空白字符作为分隔符.这对于匹配包含"/"的路径名特别有用,以避免LTS(倾斜牙签综合征).如果"?" 是分隔符,然后是"PATTERN"的仅匹配一次规则?适用.如果"'"是分隔符,则不对PATTERN执行插值.当在标识符中使用有效字符时,在m之后需要空格.

  • 理论和实践在这里有点冲突. (5认同)

tch*_*ist 6

当前词法分析器中存在一个错误,有时会阻止将 UTF-8 字符用作分隔符,即使您可以在不处于完整 Unicode 模式的情况下通过它偷偷使用 Latin1。

  • `$str =~ m Í ô` 也可以解析(并且有效),但这不是 latin1(阿拉伯语 iso-8859-6)。 (2认同)

yst*_*sth 5

几乎可以使用任何非空白字符,但标识符字符必须与初始 m 用空格分隔。尽管当您使用单引号作为分隔符时,它会禁用插值和大多数反斜杠转义。


tad*_*dmc 5

通常情况下,我想"我能写一个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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 别担心@Tim Nordenfur,我确信他不需要支付电脑加班费:) (2认同)