我想要一个 Perl 正则表达式来匹配字符串中的重复单词。
给定以下输入:
$str = "Thus joyful Troy Troy maintained the the watch of night..."
我想要以下输出:
就这样快乐的 [Troy Troy] 维持 [the] 守夜...
最佳答案
这类似于 Learning Perl 之一练习。诀窍是捕获所有重复的单词,因此您需要在重复项上使用“一个或多个”量词:
$str = 'This is Goethe the the the their sentence';
$str =~ s/\b((\w+)(?:\s+\2\b)+)/[\1]/g;
我将要使用的功能在 perlre 中都有描述。 , 当他们申请一个模式时,或 perlop当它们影响替换运算符的工作方式时。
如果您喜欢
/x
添加无关紧要的空格和注释的标志: $str =~ s/
\b
(
(\w+)
(?:
\s+
\2
\b
)+
)
/[\1]/xg;
我不喜欢那样
\2
虽然因为我讨厌计算相对位置。我可以在 Perl 5.10 中使用相对反向引用。 \g{-1}
指紧接在前面的捕获组: use 5.010;
$str =~ s/
\b
(
(\w+)
(?:
\s+
\g{-1}
\b
)+
)
/[\1]/xg;
计数也不是那么好,所以我可以使用标记匹配:
use 5.010;
$str =~ s/
\b
(
(?<word>\w+)
(?:
\s+
\k<word>
\b
)+
)
/[\1]/xg;
我可以标记第一个捕获 (
$1
) 并在 %+
中访问它的值之后: use 5.010;
$str =~ s/
\b
(?<dups>
(?<word>\w+)
(?:
\s+
\k<word>
\b
)+
)
/[$+{dups}]/xg;
不过,我真的不需要第一次捕获,因为它实际上只是用来引用匹配的所有内容。可悲的是,它看起来像
${^MATCH}
设置得不够早,我无法在替换端使用它。我认为这是一个错误。这应该有效,但无效: $str =~ s/
\b
(?<word>\w+)
(?:
\s+
\k<word>
\b
)+
/[${^MATCH}]/pgx; # DOESN'T WORK
我正在 blead 上检查这个,但是在我的小型机器上编译需要一点时间。
关于regex - 如何使用 Perl 正则表达式突出显示连续重复的单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2505224/