有没有一种简单的方法可以匹配每行超过1次指定字符串的出现?

时间:2009-07-29 18:31:52

标签: regex perl

我一直在努力做到以下几点:

 if (m/(foobar)\{2,}?/ig)

处理文件并仅对那些存在大于2个'foobar'的行进行操作。不工作 - 我怀疑它可能需要“反向引用”技术,但如果有人能用简单的匹配技术做到这一点,我会感到惊喜

2 个答案:

答案 0 :(得分:7)

您无法使用{}量词,因为这仅适用于重复。 (例如“foobar foobar foobar”)。如果你的字符串有“fooobar更多foobar”,它将无法匹配。最简单,最清晰的方法是将匹配推送到这样的数组:

 my @matches = $str =~ /(foobar)/ig;

然后@matches将举行所有比赛。

if (@matches >=2) {
   # work in special sauce
}

答案 1 :(得分:7)

这很简单:

if ( $str =~ /foobar.*foobar/ ) {

当然 - 你的foobar可能有点复杂,所以让我们使用反向引用:

if ( $str =~ /(foobar).*\1/ ) {

如果你想让它匹配,只要这个符合5次就足够了怎么办?简单:

if ( $str =~ /(foobar)(.*\1){4}/ ) {

或更好:

if ( $str =~ /(foobar)(?:.*\1){4}/ ) {

有关?:和其他此类魔法字符串的详细信息,您可以选择perldoc perlre