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

标签 regex perl

如何使用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/

相关文章:

perl - 我应该将 perl 'xt' 测试上传到 CPAN 吗?

java - 获取字符串的最后一个数字部分

perl - 如何拆分一条线并重新排列其元素?

arrays - Perl 简单的 FIFO 计算

javascript - RegExp.exec 在 Firefox 上的奇怪行为

regex - 将二进制数分成零组和一组

perl - 访问Dancer Log对象?

regex - 在具有以特定模式开头的第二行的两行之间插入行

regex - 使用模式 Angular 2 进行输入验证

javascript - javascript 中的正则表达式lookbehind