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

时间:2011-04-24 12:55:40

标签: regex perl unicode

哪些字符可以用作Perl正则表达式的分隔符? m/re/m(re)måreå似乎都有效,但我想了解所有可能性。

4 个答案:

答案 0 :(得分:23)

来自perlop

  

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

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

  

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

之后需要空格

答案 1 :(得分: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";
        }
    }
}

答案 2 :(得分:4)

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

答案 3 :(得分:3)

词法分析器中目前存在一个错误,有时会阻止将UTF-8字符用作分隔符,即使你没有处于完全Unicode模式也可以使用它来偷偷摸摸拉丁语。