2011-10-22 169 views
1

我需要一些幫助來編寫用於字符匹配的正則表達式。情況是我有一個包含大約30萬行的文本文件,每行一個字。我需要找到與某些字符匹配的字詞。與通配符匹配的正則表達式,表達式中的每個字符只能使用一次

想想拼字遊戲是一個非常類似的例子,其中一個用戶有一個字符集,例如說P(E S)加上通配符字符,可以匹配任何字符(但只有一次)。

如果文本文件包含以下文字:

  • PIE
  • PIES
  • PEES
  • PASS

...只有粗體字應匹配,因爲每個用戶的字符(包括通配符)只能在匹配中最多使用一次。

有沒有辦法爲此寫一個正則表達式?

我已經開始用...:

\ B [P,E,S] \ b

...但不知道應該怎麼表達:

  1. 每個字符(P,E,S)只能使用一次
  2. 任何字符(通配符)也可以使用一次

預先感謝您!請讓我知道是否需要澄清問題。

// Peter

+0

因此可以在任何地方一詞出現通配符,是嗎? –

+0

你正在使用什麼正則表達式引擎/版本? – clarkb86

+1

這個「類」問題可以通過http://stackoverflow.com/questions/7418910/scrabble-word-finder-with-wildcards解決,Lippert解釋瞭如何解決它。正則表達式不是所有問題的最終通配符。 – xanatos

回答

1

這對使用正則表達式(如果可能的話)並不是很容易。 簡單多了會是這樣的:

List<char> set = new List<char>("PES"); 

string s = "PIES"; 

bool matches = s.Count(ch => !set.Remove(ch)) < 2; 
1

一切皆有可能:

可以使用lookahaeds用正則表達式做到這一點:

(?=^.+$)(?=^[^P]*?P?[^P]*?$)(?=^[^E]*?E?[^E]*?$)(?=^[^S]*?S?[^S]*?$) 

基本上,如果你打破它有五個部分組成:

First lookahead:

(?=^.+$) 

檢查是否長度爲> = 1

然後三個部分:

(?=^[^P]*?P?[^P]*?$) 

對於E和S分別檢查是否最大的這些字符1存在。

上面只是簡單地告訴檢查整個字符串是否出現一次P.​​如果發現多於一個P,則正則表達式失敗。同樣適用於以下兩個預覽。

對於通配符我得想一個聰明的辦法做到這一點:) ..

+0

我可能是錯的,但在我看來,實際文本文件中的單詞可能超過4個字符。 – clarkb86

+0

從他寫的,似乎你不需要使用所有的字符,所以'PI'和'PE'都將是有效的 – xanatos

+0

那麼也許「」也是有效的,我猜:) – FailedDev