gpt4 book ai didi

regex - perl 中正则表达式匹配的奇怪问题,替代尝试匹配

转载 作者:行者123 更新时间:2023-12-04 17:51:14 25 4
gpt4 key购买 nike

考虑以下 perl 脚本:

 #!/usr/bin/perl

my $str = 'not-found=1,total-found=63,ignored=2';

print "1. matched using regex\n" if ($str =~ m/total-found=(\d+)/g);
print "2. matched using regex\n" if ($str =~ m/total-found=(\d+)/g);
print "3. matched using regex\n" if ($str =~ m/total-found=(\d+)/g);
print "4. matched using regex\n" if ($str =~ m/total-found=(\d+)/g);

print "Bye!\n";

运行后的输出是:
1. matched using regex
3. matched using regex
Bye!

相同的正则表达式匹配一次,之后不会立即匹配。知道为什么在 perl 中尝试用相同的正则表达式匹配相同的字符串会失败吗?

谢谢!

最佳答案

这是为什么您的代码不起作用的详细解释。
/g修饰符将正则表达式的行为更改为“全局匹配”。这将匹配字符串中所有出现的模式。但是,如何进行匹配取决于上下文。 Perl 中的两个(主要)上下文是列表上下文(复数)和标量上下文(单数)。

列表上下文 ,全局正则表达式匹配返回所有匹配子字符串的列表,或所有匹配捕获的平面列表:

my $_ = "foobaa";
my $regex = qr/[aeiou]/;

my @matches = /$regex/g; # match all vowels
say "@matches"; # "o o a a"

标量上下文 ,匹配似乎返回一个 perl bool 值,描述正则表达式是否匹配:
my $match = /$regex/g;
say $match; # "1" (on failure: the empty string)

但是,正则表达式变成了迭代器。每次执行正则表达式匹配时,正则表达式从字符串中的当前位置开始,并尝试匹配。如果匹配,则返回 true。如果匹配失败,则
  • 匹配返回 false,并且
  • 字符串中的当前位置设置为开头。

  • 因为字符串中的位置被重置,下一次匹配将再次成功。
    my $match;
    say $match while $match = /$regex/g;
    say "The match returned false, or the while loop would have go on forever";
    say "But we can match again" if /$regex/g;

    第二个效果 - 重置位置 - 可以通过附加 /c 取消。旗帜。

    可以使用 pos 访问字符串中的位置。功能: pos($string)返回当前位置,可以设置为 pos($string) = 0 .

    正则表达式也可以用 \G anchor 定当前位置的断言,很像 ^在字符串的开头 anchor 定一个正则表达式。

    m//gc -style 匹配使编写分词器变得容易:
    my @tokens;
    my $_ = "1, abc, 2 ";
    TOKEN: while(pos($_) < length($_)) {
    /\G\s+/gc and next; # skip whitespace
    # if one of the following matches fails, the next token is tried
    if (/\G(\d+)/gc) { push @tokens, [NUM => $1]}
    elsif (/\G,/gc ) { push @tokens, ['COMMA' ]}
    elsif (/\G(\w+)/gc) { push @tokens, [STR => $1]}
    else { last TOKEN } # break the loop only if nothing matched at this position.
    }
    say "[@$_]" for @tokens;

    输出:
    [NUM 1]
    [COMMA]
    [STR abc]
    [COMMA]
    [NUM 2]

    关于regex - perl 中正则表达式匹配的奇怪问题,替代尝试匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15818111/

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