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

mur*_*uga 6 regex perl

我想要一个Perl正则表达式,它将匹配字符串中的重复单词.

鉴于以下输入:

$str = "Thus joyful Troy Troy maintained the the watch of night..."
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

Thus joyful [Troy Troy] maintained [the the] watch of night...

bri*_*foy 12

这类似于Learning Perl练习之一.诀窍是捕获所有重复的单词,因此在复制时需要"一个或多个"量词:

 $str = 'This is Goethe the the the their sentence';

 $str =~ s/\b((\w+)(?:\s+\2\b)+)/[\1]/g;
Run Code Online (Sandbox Code Playgroud)

我将要使用的功能在perlre中描述,当它们应用于模式时,或者当它们影响替换运算符的工作时perlop.

如果你喜欢这个/x标志添加无关紧要的空白和评论:

 $str =~ s/
      \b
      (
         (\w+)
         (?:
          \s+
          \2
          \b
         )+
      )
     /[\1]/xg;
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样,\2因为我讨厌计算相对位置.我可以使用Perl 5.10中的相对反向引用.的\g{-1}是指紧接在前的捕获组:

 use 5.010;
 $str =~ s/
      \b
      (
         (\w+)
         (?:
          \s+
          \g{-1}
          \b
         )+
      )
     /[\1]/xg;
Run Code Online (Sandbox Code Playgroud)

计数也不是那么好,所以我可以使用带标签的匹配:

 use 5.010;
 $str =~ s/
      \b
      (
         (?<word>\w+)
         (?:
          \s+
          \k<word>
          \b
         )+
      )
     /[\1]/xg;
Run Code Online (Sandbox Code Playgroud)

我可以标记第一个capture($1)并在%+以后访问它的值:

 use 5.010;
 $str =~ s/
      \b
      (?<dups>
         (?<word>\w+)
         (?:
          \s+
          \k<word>
          \b
         )+
      )
     /[$+{dups}]/xg;
Run Code Online (Sandbox Code Playgroud)

我不应该真的需要第一次捕获,因为它真的只是在那里引用匹配的所有东西.可悲的是,它似乎${^MATCH}没有足够早地让我在替换方面使用它.我认为这是一个错误.这应该有效,但不是:

 $str =~ s/
      \b
         (?<word>\w+)
         (?:
          \s+
          \k<word>
          \b
         )+
     /[${^MATCH}]/pgx;   # DOESN'T WORK
Run Code Online (Sandbox Code Playgroud)

我在blead上检查这个,但是在我的小机器上编译需要一些时间.


Kip*_*Kip 10

这有效:

$str =~ s/\b((\w+)\s+\2)\b/[\1]/g;
Run Code Online (Sandbox Code Playgroud)

  • `$ str = ~s /\b((\ w +)(?:\ s +\2)+)\ b/[\ 1]/g;`匹配任意数量的重复 (7认同)
  • @briandfoy:......在你改变它之前,这正是问题所要求的.埃里克在评论中发布了一个匹配不止一次重复的版本. (6认同)
  • 在此讨论:http://meta.stackexchange.com/questions/43842/someone-other-than-op-edits-question-then-comments-that-accepted-answer-is-wrong/ (4认同)
  • @brian:我要编辑你的一些问题,因为我比你更了解你的问题.BRB (3认同)