perl正则表达式匹配重复单词

时间:2014-04-11 00:21:16

标签: regex perl

一个正则表达式,匹配具有相同单词重复的任何输入行 连续两次或多次连续。假设连续之间有一个空格 字

if($line!~m/(\b(\w+)\b\s){2,}/{print"No match\n";}
    {   print "$`";       #print out first part of string
        print "<$&>";     #highlight the matching part
        print "$'";       #print out the rest
    }

这是我到目前为止最好的,但有些不对劲 如果我错了,请纠正我

\b以字边界开头

(\w+)后跟一个或多个单词

\b以字边界结束

\s然后是空格

{2,}检查此事是否重复2次或更多次

我的表达方式有什么问题

3 个答案:

答案 0 :(得分:1)

这应该是您正在寻找的内容:(?:\b(\w+)\b) (?:\1(?: |$))+

此外,当您只是寻找空格时不要使用\s,因为您可能会匹配换行符或其他空白字符。简单空格不是正则表达式中的分隔符或特殊字符,因此只需键入空格即可。如果您希望它在视觉上更明显,可以使用[ ]

答案 1 :(得分:1)

我在regexr.com尝试了CAustin的答案,结果并不是我所期望的。此外,不需要所有非捕获组。

我的正则表达式:

(\b(\w+))( \2)+

单词边界,后跟(1个或多个单词字符)[组2],后跟一个或多个:空格,组2。

下一个用\s+替换空格,将单词之间的分隔概括为任何类型的空白区域中的1个或更多:

(\b(\w+))(\s+\2)+

答案 2 :(得分:0)

您实际上并未查看它是否是重复的相同字词。为此,您需要使用捕获的反向引用:

if ($line =~ m/\b(\w+)(?:\s\1){2,}\b/) {
     print "matched '$1'\n";
}

此外,只要您正在测试正则表达式,如果您创建要使用的示例列表,它会很有帮助。以下演示了使用__DATA__

执行此操作的一种方法
use strict;
use warnings;

while (my $line = <DATA>) {
    if ($line =~ m/\b(\w+)(?:\s\1){2,}/) {
        print "matched '$1'\n";
    } else {
        print "no match\n";
    }
}

__DATA__
foo foo
foo bar foo
foo foo foo

输出

no match
no match
matched 'foo'