regex - 如何使用 Perl 正则表达式突出显示连续重复的单词?

标签 regex perl

我想要一个 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/

相关文章:

perl - 使用单行删除第 N 次出现后的内容

perl - 安装后测试perl

perl - 使用数组寻址哈希的哈希

regex - sed - 只删除带元音的单词

用于 XLSX 文件扩展名的 Java 正则表达式

javascript - 如何匹配字符串开头和结尾的相同字符

regex - sed 脚本删除空行之前的行

mysql:如何转义perl字符串中的括号

Perl AnyEvent 抛出 HTTP 错误 595

regex - python多行正则表达式获取括号中的可选组