2015-10-19 75 views
1

我必須找到空格分隔的單詞。用最小的回溯來做什麼最佳實踐?正則表達式找到用空格分隔的單詞,回溯

我發現這個解決方案:

Regex: \d+\s([a-zA-Z]+\\s{0,1}){1,} in a sentence 
Input: 1234 this is words in a sentence 

所以,this is words - 我有使用正則表達式([a-zA-Z]+\\s{0,1}){1,}和文字in a sentence我已經常量字在正則表達式in a sentences檢查檢查。

但在這種情況下regex101.com給我調試4156步驟,這是災難性的回溯。任何方式來避免它?

我還有其他更復雜的例子,它需要86000步,它不驗證。

主要問題,我必須找到所有由空格分隔的單詞,但是在同一時間,正則表達式包含由空格(常量)分隔的單詞。這是我的災難性回溯。

我必須使用Java來做到這一點。

+0

你可以用'\ w'替換'[a-zA-Z]'來表示所有非空白字符,對嗎? – Arc676

+1

我不知道我是否誤解了你的問題,但不能簡單地使用'String.split()'? – dguay

+0

如果您根據空格/點/空格拆分字符串並從那裏出發,會有幫助嗎? – xaviert

回答

0

你可以嘗試拆分字符串轉換爲字符串數組,然後消除不要你一個單詞的定義相匹配的陣列中的任何成員後發現數組的大小(例如,一個空格或標點符號)

String[] mySplitString = myOriginalString.split(" "); 
for(int x = 0; x < mySplitString.length; x++){ 
    if(mySplitString[x].matches("\\w.*"/*Your regex for a word here*/)) words++; 
} 

mySplitString是已從原始字符串中拆分的字符串數組。刪除所有空白字符,將空白之前,之後或之間的子字符串放入新的字符串數組中。 for循環遍歷split字符串數組並檢查以確保每個數組成員都包含一個字(字符或數字至少一次)並將其添加到總字數中。

0

你想找到由space分開的單詞。所以你應該至少說1 or more space。你可以用這個代替它只需要37步。

\d+\s([a-zA-Z]+\s+)+in a sentence 

查看演示。

https://regex101.com/r/tD0dU9/4

對於Java雙逃逸所有IE \d==\\d

+0

這是一個很好的解決方案。我有一個正則表達式的生成器和輸入字符串爲他們現在,使用您的優化,我得到更多的性能。我現在會測試,也許我會對此有任何其他問題。謝謝!我會在後面標記。 – dikkini

0

如果我的理解是正確的,你想匹配空間,加上「在一個句子」之句separeted任何單詞。

你可以嘗試以下解決方案:

(in a sentence)|(\S+) 

可以看出在這個例子上regex101:Exemple

正則表達式配襯在61步。 在「在句子中」之後,您可能會遇到標點符號問題。做一些測試。

我希望我很有幫助。

+0

通過@vks解決方案需要37個步驟 – dikkini