[英]perl Regular expression matching repeating words
一個正則表達式,它與具有相同單詞連續連續重復兩次或更多次的輸入行匹配。 假設連續單詞之間有一個空格
if($line!~m/(\b(\w+)\b\s){2,}/{print"No match\n";}
{ print "$`"; #print out first part of string
print "<$&>"; #highlight the matching part
print "$'"; #print out the rest
}
到目前為止,這是我最好的選擇,但是如果我做錯了,那我就有些錯誤了
\\b
以單詞邊界開頭
(\\w+)
后接一個或多個單詞
\\b
以單詞邊界結尾
\\s
然后是空格
{2,}
檢查這件事是否重復2次或更多次
我的表情怎么了
這應該是您要尋找的內容: (?:\\b(\\w+)\\b) (?:\\1(?: |$))+
另外,在查找空格時請勿使用\\s
因為您可能會匹配換行符或其他空白字符。 簡單的空格不是正則表達式中的定界符或特殊字符,因此只需鍵入空格即可。 如果您希望它在視覺上更加明顯,可以使用[ ]
。
我在regexr.com上嘗試了CAustin的回答,但結果卻出乎我的意料。 同樣,不需要所有非捕獲組。
我的正則表達式:
(\b(\w+))( \2)+
單詞邊界,后跟(1個或多個單詞字符)[組2],然后是以下一項或多項:空格,組2。
接下來的一個用\\s+
替換空格,將單詞之間的分隔概括為1或多個任何一種空白:
(\b(\w+))(\s+\2)+
您實際上並沒有在檢查是否重復相同的單詞。 為此,您需要使用捕獲的反向引用:
if ($line =~ m/\b(\w+)(?:\s\1){2,}\b/) {
print "matched '$1'\n";
}
此外,無論何時測試正則表達式,如果您創建要使用的示例列表,都會很有幫助。 下面演示了使用__DATA__
塊的一種方法
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
輸出
no match
no match
matched 'foo'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.