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

问题描述 投票:0回答:5

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

m/re/
m(re)
måreå
似乎都有效,但我想知道所有可能性。

regex perl unicode delimiter
5个回答
33
投票

来自

perlop

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

所以除了空白之外什么都可以。完整段落是:

如果“/”是分隔符,则开头的 m 是可选的。通过 m,您可以使用任意一对非空白字符作为分隔符。这对于匹配包含“/”的路径名特别有用,以避免 LTS(倾斜牙签综合症)。如果 ”?”是分隔符,那么?PATTERN? 的只匹配一次规则适用。如果“'”是分隔符,则不对 PATTERN 执行插值。当使用标识符中有效的字符时,m 后面需要空格。


7
投票

通常情况下,我想知道“我可以编写一个 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";
        }
    }
}

6
投票

目前词法分析器中存在一个错误,有时会阻止将 UTF-8 字符用作分隔符,尽管如果您未处于完整 Unicode 模式,您可以通过它偷偷使用 Latin1。


5
投票

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


0
投票

一个很晚的答案,但由于匹配运算符

m
是需要一对分隔符的运算符之一。这也通过
m()
在问题本身中得到了体现,这是一个记住您还可以使用平衡对的好时机,例如
<
>
等等。

请参阅 # 附录 → perlop 的额外配对定界符列表部分中的完整列表。

如果在替换 (

s///
) 或音译 (
y///
) 操作中使用三个分隔符,您可以使用两对,例如
s{}{}
,它们也可以是不同类型,例如
s{}<>

© www.soinside.com 2019 - 2024. All rights reserved.