Regex 匹配重复单词的perl正则表达式
一种正则表达式,它匹配重复使用同一单词的任何输入行 连续两次或多次。假设连续两个字符之间有一个空格 言语Regex 匹配重复单词的perl正则表达式,regex,perl,Regex,Perl,一种正则表达式,它匹配重复使用同一单词的任何输入行 连续两次或多次。假设连续两个字符之间有一个空格 言语 if($line!~m/(\b(\w+)\b\s){2,}/{print“No match\n”;} {打印“$”;#打印字符串的第一部分 打印“”;#突出显示匹配零件 打印“$”;#打印出其余部分 } 这是目前为止我得到的最好的结果,但有点不对劲 如果我错了,请纠正我 \b以单词边界开头 (\w+)后跟一个或多个单词 \b以单词边界结尾 \s然后是一个空格 {2,}检查此操作是否重复2次
if($line!~m/(\b(\w+)\b\s){2,}/{print“No match\n”;}
{打印“$”;#打印字符串的第一部分
打印“”;#突出显示匹配零件
打印“$”;#打印出其余部分
}
这是目前为止我得到的最好的结果,但有点不对劲
如果我错了,请纠正我
\b
以单词边界开头
(\w+)
后跟一个或多个单词
\b
以单词边界结尾
\s
然后是一个空格
{2,}
检查此操作是否重复2次或更多次
我的表达式有什么问题?您实际上没有检查它是否是重复的同一个单词。为此,您需要使用捕获的反向引用:
if ($line =~ m/\b(\w+)(?:\s\1){2,}\b/) {
print "matched '$1'\n";
}
此外,在测试正则表达式时,创建一个示例列表非常有用。下面演示了使用\uuuu DATA\uuuu
块进行测试的一种方法
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
这应该是您正在寻找的:
(?:\b(\w+)\b)(?:\1(?:$)+
另外,在查找空格时不要使用
\s
,因为可能会匹配换行符或其他一些空白字符。简单空格在正则表达式中不是分隔符或特殊字符,因此只需键入空格即可。您可以使用[]
如果你想让它更直观。我在中尝试了CAustin的答案,结果不是我所期望的。而且,不需要所有非捕获组
我的正则表达式:
(\b(\w+))( \2)+
单词边界,后跟(1个或多个单词字符)[组2],后跟一个或多个:空格,组2
下一个将空格替换为\s+
,将单词之间的分隔概括为1个或多个任意类型的空格:
(\b(\w+))(\s+\2)+
谢谢,我正在使用此网站也很有帮助此代码中有一个错误,当我尝试匹配
foo foo
时,它会突出显示fo
o foo。单词应该以空格结尾。另外,我不太理解?:\s\1
。我知道它们分别的意思。如果单词应该以空格结尾,只需添加一个额外的单词ary\b
结尾。你能给我解释一下这个表达式吗?我不太明白第二部分第二部分以\1
开始,它是对正则表达式中第一个捕获组(包含在()
中的内容)的引用。这意味着它告诉正则表达式“记住”它在(\w)中发现的内容
,然后在\1
所在的位置再次查找。之后是一个非捕获组(使用(?:)
),它查找普通空格或字符串的结尾。整个模式的后半部分由它自己的捕获组包围,使用该捕获组可以将其作为一个整体进行量化+
(如果它不在一个组中,那么+
将只适用于(?:|$)
。
(\b(\w+))( \2)+
(\b(\w+))(\s+\2)+