gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:38:01 25 4
gpt4 key购买 nike

我在理解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com