一个正则表达式,匹配具有相同单词重复的任何输入行 连续两次或多次连续。假设连续之间有一个空格 字
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次或更多次
我的表达方式有什么问题
答案 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'