2014-04-11 117 views
1

正則表達式,匹配連續兩次或多次連續兩次或更多次具有相同單詞的任何輸入行。假設有連續 單詞之間有一個空格perl正則表達式匹配重複單詞

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次以上

有什麼錯我的表情

回答

1

這應該是你要找的內容的一種方式:(?:\b(\w+)\b) (?:\1(?: |$))+

另外,不要使用\s時你只是在尋找空格,因爲它可能會匹配換行符或其他空格字符。簡單的空格不是正則表達式中的分隔符或特殊字符,所以只需輸入空格即可。如果您希望它更直觀,可以使用[ ]

+0

你介意給我解釋一下這個表達嗎?我不太明白第二部分 – user3422317

+0

第二部分以'\ 1'開頭,它是對正則表達式中第一個捕獲組(包含在(()中的東西)的引用。這意味着它告訴正則表達式「記住」它用'(\ w)'找到的內容,然後在'\ 1'處再次找到它。之後是一個非捕獲組(使用'(?:)')查找正常空間或字符串的結尾。整個模式的後半部分被自己的捕獲組所包圍,這個捕獲組可以用'+'作爲整體進行量化(如果它不在一個組中,那麼'+'只適用於'(?:| $)'。 – CAustin

0

你實際上並沒有檢查,看它是否是一個的重複着同樣的話。要做到這一點,你需要使用捕捉反向引用:

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' 
+0

謝謝,我使用這個網站[鏈接](http://regex101.com/R/cU5lC2#PC RE)也有幫助 – user3422317

+0

這段代碼有一個錯誤,當我嘗試匹配'fo foo foo'時,它突出顯示'fo fo foo foo。這個詞應該以一個空格結束。我也不太瞭解'?:\ s \ 1'。我知道他們分開的意思。 – user3422317

+0

如果單詞應該以空格結尾,只需在末尾添加一個額外的單詞邊界'\ b'。 – Miller

1

我在regexr.com上試過了卡斯汀的回答,結果並不是我所期望的。另外,不需要所有非捕獲組。

我正則表達式:

(\b(\w+))(\2)+ 

字邊界,接着(1個或多個字字符)[第2組],隨後是一個或多個:空間,組2

這下一個一個與\s+替換空間,概括的詞之間的分離是1個或多個任何類型的空白的:

(\b(\w+))(\s+\2)+