regex - 对 Perl 中正则表达式基本规则的困惑

标签 regex perl

我在理解 regex 的基本规则时遇到了很多麻烦,希望有人能用“简单的英语”帮助解释它们。

$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. (3)';

print "Enter a regular expression: ";
my $pattern = <STDIN>;
chomp($pattern);

if (/$pattern/) {
    print "The text matches the pattern '$pattern'.\n";
    print "\$1 is '$1'\n" if defined $1;
    print "\$2 is '$2'\n" if defined $2;
    print "\$3 is '$3'\n" if defined $3;
    print "\$4 is '$4'\n" if defined $4;
    print "\$5 is '$5'\n" if defined $5;
}

三个测试输出

Enter a regular expression: ([a-z]+)
The text matches the pattern '([a-z]+)'
$1 is 'silly'

Enter a regular expression: (\w+)
The text matches the pattern '(\w+)'
$1 is '1'

Enter a regular expression: ([a-z]+)(.*)([a-z]+)
The text matches the pattern '([a-z]+)(.*)([a-z]+)'
$1 is 'silly'
$2 is " sentence (495,a) *BUT* one which will be usefu'
$3 is 'l'

我的困惑如下

  1. ([a-z]+) 不是“小写字母和一个/多个重复”的意思吗?如果是这样,不应该也选择“will”吗?除非它与 () 有关内存有关(即“silly”是 5 个字母的单词,所以“will”不会被拾起,但“willx”会 ??)

  2. (\w+) 不是“任何单词和一个/多个重复”的意思吗?如果是这样,为什么数字“1”被选中,因为没有重复但后面有一个冒号“:”?

  3. ([a-z]+)(.*)([a-z]+)的意思是“任何小写和重复”,紧接着是“任何东西和 0 个或更多重复” ,紧接着是“任何小写并重复”?如果是这样,为什么输出看起来像上面显示的那样?

我尝试尽可能多地在网上查找,但仍然无法理解它们。任何帮助将不胜感激。谢谢。

最佳答案

  1. 不是,它的意思是“一个或多个无重音的小写拉丁字母”。

    是的,“will” 也会匹配,但是除非您使用 /g,否则匹配操作只会返回第一个匹配项。

    print "$1\n" while /([a-z]+)/g;  # //g in scalar context
       or
    print "$_\n" for /([a-z]+)/g;    # //g in list context
    

    参见 perlop 中的 m/PATTERN/有关如何使用 /g 的详细信息。

  2. 不是,它的意思是“一个或多个单词字符”,所以它确实可以匹配单个字符。

    或者您可能对 1 是一个字符字符感到惊讶?在 ASCII 范围内,单词字符为 A-Za-z0-9_。在 ASCII 范围之外发现了另外 102,661 个单词字符。

  3. 意思是“一个或多个不带重音的小写拉丁字母,后跟除换行符以外的任意数量的字符,再后跟一个或多个不带重音的小写拉丁字母”。

    如果您问为什么 .* 匹配得如此之多,引擎将始终在当前位置尽可能多地匹配。这称为贪婪。

    也许您正在寻找 /([a-z]+)([^a-z]+)([a-z]+)/

关于regex - 对 Perl 中正则表达式基本规则的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604982/

相关文章:

perl - 将 select(2) 和文件句柄的缓冲 IO 结合起来是否安全?

regex - 忽略与 git diff 中的字符串匹配的更改

javascript - 匹配不以一组单词开头的字符串的正则表达式

regex - 接受数字范围的模式?

php - 如何使用 PHP 和正则表达式将 <span style ="font-weight: bold;">foo</span> 替换为 <strong>foo</strong>?

perl - Perl 中的字节序列

regex - 如何将 PCRE 转换为 POSIX RE?

perl:通过引用传递给子进程的 paths+dirs 数组将无法正确打印或打开

c - 是否有可以同时处理 C 和 Perl 的 Windows IDE?

perl WWW::Mechanize 在浏览器中启动安全登录