2012-11-13 36 views
0

說有一個句子正則表達式,匹配兩個序列一句話

山姆-I​​-AM

兩個詞在同一序列「上午」,其中第二序列是結束最後一個字。

我需要寫一個正則表達式來匹配這樣一個句子,其中的序列可以是任何字母的字符串。

該語言是Java。我不太明白的是如何在句子中匹配某些內容而忽略其他內容。

這是Java測試的準備問題。

謝謝。

這是代碼,我使用的測試

public static void doMatching(){ 

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

    try { 

     String pattern, s; 
     System.out.print("Pattern: "); 
     pattern = in.readLine(); 
     while (!pattern.equals("quit")){ 
      System.out.print("String: "); 
      s = in.readLine(); 
      System.out.println(Pattern.matches(pattern, s)); 
      System.out.print("Pattern: "); 
      pattern = in.readLine(); 
     } 
     } catch (IOException e){ 
      System.out.println("Error!"); 
    } catch (Exception e2){ 
     System.out.println("Unknown!"); 
    } 

} 


public static void main(String[] args) { 
    // TODO code application logic here 

    doMatching(); 
} 

這裏是結果

Pattern: (\\w+\\b).*\\b\\1$ 
String: that sam-i-am 
false 
+1

因此,您需要一個正則表達式來查看是否有任何單詞以最後一個單詞結尾? – FrankieTheKneeMan

+2

你有什麼想法,你在做什麼語言,以及你打算如何處理這些信息?所有這三個問題都會改變答案。 – FrankieTheKneeMan

+0

我正在使用Java。我無法圍繞我如何創建通用序列。我可以匹配[am] {2},但不知道如何在一個句子中匹配,而忽略其他所有。這是一個測試的準備問題。 – isal

回答

3
"(\\w+\\b).*\\b\\1$" 

,將在一個字(\\w+\\b)結束匹配單詞字符一些非平凡的數量,並確保它們匹配的字符串作爲一個完整單詞的結尾。

+0

+1,但請注意「單詞字符」實際上與「字母」不一樣。 – ruakh

+0

@ruakh,這很公平。是的,你應該留意這些細節。 – FrankieTheKneeMan

+0

謝謝。我試圖理解表達。但快速試用表明它不起作用。 – isal

3

您正在搜索的正則表達式是:

(\w+\b).*\b\1$ 

這也包括一個下劃線作爲一個字母,如果你需要排除你可以使用[a-zA-Z]

\w匹配任何字母
+ 1次或多次匹配前面的表達式中,一個貪婪方式
\b字邊界匹配。這是一個零寬度匹配。
()組,並將結果保存,以便以後可以使用它作爲一個反向引用
.匹配任何除換行符
* 0次或多次匹配前面的表達式,在貪婪的時尚
\1是第一個反向引用,它匹配捕獲的第一個東西()
$是字符串末尾的零寬度匹配。

零寬度匹配是實際上不包含任何字符的匹配。

+0

這是錯誤的。所有這些強制執行的是字符串的結尾在更早的某個點重複。使用單詞邊界來避免這個問題。 – FrankieTheKneeMan

+0

謝謝你。我錯過了字邊界要求。 – OmnipotentEntity

+0

+1打我解釋。 – FrankieTheKneeMan

0

這裏還有其他一些很好的答案,但我認爲這是比較合適的還是:

([a-zA-Z]+)\b.+\b\1$ 

也許雞蛋裏挑骨頭,但與正則表達式這是一個好主意,因爲簡潔,故意地。

由於問題的性質,這裏的字符範圍看起來好於\w。我認爲最好將捕獲組之外的第一個字邊界移開。並.+.*因爲必須至少有一個非單詞字符存在(雖然.*結合字邊界將幾乎肯定會匹配)。

+0

'我認爲把第一個邊界移到捕獲組之外更好。我想在捕獲組中有一個零寬度匹配是毫無意義的。 – OmnipotentEntity

+0

@OmnipotentEntity是的,我同意這不是關鍵。更重要的是刻意和明確。根據我的經驗,這使得代碼更易於支持。 – Madbreaks