如何使用Perl查找并打印与
regexp匹配的所有字符串?
以下仅查找第一场比赛.
$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 $_ }
注意在第二种情况下,我跳过了parens,因为在列表上下文中,如果没有parens则返回整个匹配.您可以添加parens来选择字符串的一部分.
您的版本使用if,使用标量上下文,它保存最近匹配的位置,但不会继续.一种看待发生的事情的方法是:
if($text =~ m/\?([^\.]+\.)/g) { print "$1\n"; } say "Rest of string: ",substr $text,pos;
pos给出了最近一场比赛的位置.
原文地址:https://www.jb51.cc/Perl/172305.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。