gpt4 book ai didi

regex - 在 Perl 中使用正则表达式获取字符串中的多个匹配项

转载 作者:行者123 更新时间:2023-12-04 20:10:47 25 4
gpt4 key购买 nike

阅读后this similar question并且多次尝试我的代码后,我不断得到相同的不想要的输出。

让我们假设我正在搜索的字符串是“我昨天看到了 wilma”。
正则表达式应该捕获 每个字后跟一个“a”及其 可选 5 个以下字符或空格。

我写的代码如下:

$_ = "I saw wilma yesterday";

if (@m = /(\w+)a(.{5,})?/g){
print "found " . @m . " matches\n";

foreach(@m){
print "\t\"$_\"\n";
}
}

但是,我不断得到以下输出:
found 2 matches
"s"
"w wilma yesterday"

虽然我希望得到以下一个:
found 3 matches:
"saw wil"
"wilma yest"
"yesterday"

直到我发现 @m 里面的返回值分别是 $1$2 ,正如你所注意到的。

现在,由于 /g标志已打开,我认为问题与正则表达式无关,我怎样才能获得所需的输出?

最佳答案

您可以尝试这种允许重叠结果的模式:

(?=\b(\w+a.{1,5}))

或者
(?=(?i)\b([a-z]+a.{0,5}))

例子:
use strict;
my $str = "I saw wilma yesterday";
my @matches = ($str =~ /(?=\b([a-z]+a.{0,5}))/gi);
print join("\n", @matches),"\n";

更多解释:

您不能与正则表达式重叠结果,因为当一个字符被正则表达式引擎“吃掉”时,它不能被第二次吃掉。避免这种约束的技巧是使用可以多次遍历字符串的前瞻(即只检查但不匹配的工具),并在其中放置一个捕获组。

对于此行为的另一个示例,您可以尝试没有单词边界的示例代码 ( \b ) 以查看结果。

关于regex - 在 Perl 中使用正则表达式获取字符串中的多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580717/

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