我想要一个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)
归档时间: |
|
查看次数: |
3102 次 |
最近记录: |