gpt4 book ai didi

regex - 如何使用Perl查找与正则表达式匹配的所有字符串实例?

转载 作者:行者123 更新时间:2023-12-04 06:45:02 28 4
gpt4 key购买 nike

如何使用Perl查找和打印与正则表达式匹配的所有字符串?

以下仅找到第一个匹配项。

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/) {
print "$1\n";
}

EDIT1: /g不起作用
#!/usr/bin/env perl

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/g) {
print "$1\n";
}

$ ./test.pl
?Adsfsadfgaasdf.

最佳答案

问题在于/g修饰符不将捕获组用于多个匹配项。您需要在标量上下文中迭代匹配项,或者在列表上下文中捕获返回的列表。例如:

use v5.10; # required for say()
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

while ($text =~ /\?([^.]+\.)/g) { # scalar context
say $1;
}
for ($text =~ /\?[^.]+\./g) { # list context
say; # match is held in $_
}

请注意,在第二种情况下,我跳过了括号,因为在列表上下文中,如果没有括号则返回整个匹配项。您可以添加括号以选择字符串的一部分。

您的版本使用 if,使用标量上下文,该上下文保存了最近匹配项的位置,但不会继续。一种查看发生的情况的方法是:
if($text =~ m/\?([^\.]+\.)/g) {
print "$1\n";
}
say "Rest of string: ", substr $text, pos;
pos给出最近匹配的位置。

关于regex - 如何使用Perl查找与正则表达式匹配的所有字符串实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916191/

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