2009-05-05 59 views
3

我想用一個正則表達式來匹配所有具有更多一個字符的單詞,而不是完全由相同字符組成的單詞。如何將單詞與多個字符相匹配?

這不應該匹配:TTTTT,RRRRR,ggggggggggggg

這應該匹配:rttttttt,文字,wwwwwwwwwu

回答

6

下面的表達式可以解決這個問題。

^(?<FIRST>[a-zA-Z])[a-zA-Z]*?(?!\k<FIRST>)[a-zA-Z]+$ 
  • 捕獲的第一個字符爲基團FIRST
  • 捕獲一些更多的字符(懶惰地避免回溯)
  • 確保從FIRST該下一個字符是不同的使用負前向斷言
  • 捕獲所有(至少一個由於斷言)剩餘字符

請注意,這足以查找與第一個字符不同的字符,因爲如果沒有字符與第一個字符不同,則所有字符都相同。

您可以縮短以下表達式。

^(\w)\w*?(?!\1)\w+$ 

這將匹配除[a-zA-Z]以外的其他字符。

+0

很好的解釋 – 2009-05-05 16:03:54

0

以下RE會做什麼你問的相反:比賽,其中一個字由相同的字符組成。儘管如此,它可能仍然有用。

\b(\w)\1*\b 
1

我想補充的所有獨特單詞的列表,然後使用這個表達式

\ B(\ W)\ 1+ \ b

抓住所有一個字符單詞並擺脫他們

1

這不使用正則表達式,但我相信它會做你所要求的:

public bool Match(string str) 
{ 
    return string.IsNullOrEmpty(str) 
       || str.ToCharArray() 
        .Skip(1) 
        .Any(c => !c.Equals(str[0])); 
} 
0
\b\w*?(\w)\1*(?:(?!\1)\w)\w*\b 

\b(\w)(?!\1*\b)\w*\b 

這是假設你拔的話了一些較大的文本的;這就是爲什麼它需要字邊界和填充。如果你有一個單詞列表和你只是想驗證符合標準的,更簡單的正則表達式可能會做:

(.)(?:(?!\1).) 

...因爲你已經知道每個字只包含單詞字符。另一方面,根據您對「單詞」的定義,您可能需要將前兩個正則表達式中的\w替換爲更具體的內容,如[A-Za-z]