2013-01-02 135 views
1

我一直在Google上搜索幾個小時,並得到了部分解決方案。正則表達式來查找兩個字符串之間的常見字母

我是Groovy和正則表達式的新手。多年來我一直使用正則表達式,但是我對此感到很不舒服。

我有一個簡單的遊戲,檢查你有多少字母與隱藏的單詞共同。

爲了簡單起見,我們假設單詞是「pan」,而人物類型是「can」。

我想正則表達式的結果給我「一個」。

現在,我這有部分原因是這樣做的工作(在Groovy):

// Where "guess" is the user's try and "word" is the word they need to guess. 
def expr = "[$word]" 
def result = guess.find(expr) 

結果字符串只包含第一個匹配的字母。任何人都有更優雅的解決方案? 在此先感謝

+2

這看起來並不像正則表達式的一個很好的用例。 – Philipp

+0

[最長公共子串問題](https://en.wikipedia.org/wiki/Longest_common_substring_problem) – RobertB

+1

你對「有共同字母」的定義是什麼?他們是否需要處於相同的位置或單詞中的任何位置?他們必須按照正確的順序嗎? – Philipp

回答

1

假設兩個字符串S1和S2 現在找到共同的字符串做:

commonString=s1.replaceAll("[^"+s2+"]",""); 

,如果你的字包含元字符,然後 第一DO:

Pattern.quote(s2); 

然後

commonString=s1.replaceAll("[^"+s2+"]",""); 
+0

謝謝@Ranjit嘗試過,它也可以。仍在研究是否更優雅的方法,這或上面的「findAll」。 – Anthony

+0

感謝@Ranjt這兩個想法的工作,這一個吸引力,因爲我對正則表達式的簡單理解可以處理它! – Anthony

0

你可以嘗試:

guess.findAll(/[$word]/).join() 
+0

謝謝@tim_yates試過,它的工作原理。你能解釋一下「加入」部分嗎?我想我得到的正則表達式,但我不知道爲什麼斜槓產生的結果,我的理解是[$ word]會做同樣的? – Anthony

3

我認爲這不是正則表達式的用例。如果他輸入.*或類似的東西,你就不得不照顧用戶自動猜測。

典型的採集工作更適合IMO這項任務。一個解決辦法是找到兩個詞的路口把他們當作字符集:

(word as Set).intersect(guess as Set).join() 

或過濾出現在祕密字猜測字符:

guess.findAll { word.contains(it) }.unique().join() 
+0

謝謝@epidemian,仍然在與Groovy交手,但這看起來很酷。 – Anthony

相關問題