3

我在理解基本规则时遇到了很多麻烦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]+)意味着“小写字母和一个/多个重复”?如果是这样,“将”不应该也被拾起吗?除非它与 () 有关记忆有关(即“silly”是 5 个字母的单词,所以“will”不会被选中,但“willx”会??)

  2. (\w+)意味着“任何单词和一个/多个重复”?如果是这样,为什么会选择数字“1”,因为后面没有重复,而是冒号“:”?

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

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

4

2 回答 2

6
  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
    

    有关如何使用的详细信息,m/PATTERN/请参阅perlop/g

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

    或者你很惊讶这1是一个字符?在 ASCII 范围内,字符是A-Z、和. 在 ASCII 范围之外发现了另外 102,661 个字字符。a-z0-9_

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

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

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

于 2013-03-24T22:53:06.857 回答
0
  1. 我真的不知道你为什么会这样。它查看您的句子并找到第一个小写字母并继续匹配它们,直到找不到。(在你的情况下是一个空格)匹配是“愚蠢的”,它应该是。匹配在该点停止。

  2. \w匹配“单词字符”并包含数字,但除了“_”之外不包含标点符号“:”不是单词字符,因此您得到“1”,仅此而已。

  3. 这是因为(.*)它是“贪婪的”(通常你不应该使用它)。您是在告诉 Perl 匹配任何内容到行尾。然后它会回溯,为您的最后一个检查提供匹配,该检查是您的字符串的最后一个字符。

编辑:正如@ikegami 指出的那样,它\w实际上比我想的要匹配得多。

于 2013-03-24T22:53:04.653 回答