Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 匹配重复单词的perl正则表达式_Regex_Perl - Fatal编程技术网

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)+