2011-11-16 13 views
6

請有人能告訴我如何匹配「_」和句點「。」在使用正則表達式的字符串中一次感到興奮,使用indexOf()而不是正則表達式更高效。正則表達式在java和它的性能比較index.0f

String s= "Hello_Wor.ld" or 
s="12323_!£££$.asdfasd" 

bascially任何字符數可以來之前和_.後,唯一的要求是,整個字符串應該只包含_一個次數和.

+0

你應該更關心哪一個更容易閱讀和理解的意圖,因此更容易維護,在大多數邏輯情況下'regex'將失去這種考慮,直接匹配的情況下,'regex'可能會贏。 –

回答

7

indexOf會比一個正則表達式快得多,並可能會更容易理解。

只是測試是否indexOf('_') >= 0,然後如果indexOf('_', indexOfFirstUnderScore) < 0。在這段時間做同樣的事情。

private boolean containsOneAndOnlyOne(String s, char c) { 
    int firstIndex = s.indexOf(c); 
    if (firstIndex < 0) { 
     return false; 
    } 
    int secondIndex = s.indexOf(c, firstIndex + 1); 
    return secondIndex < 0; 
} 
+0

當然可以。感謝您的更正。 –

+0

我現在可以安全地刪除我的答案! :) –

2

匹配具有單一.的字符串:

/^[^.]*\.[^.]*$/ 

同爲_

/^[^_]*_[^_]*/ 

合併正則表達式應該是這樣的:

/^([^._]*\.[^._]*_[^._]*)|([^._]*_[^._]*\.[^._]*)$/ 

現在應該很明顯indexOf是更好的解決方案,更簡單(性能無關緊要,直到它被證明是瓶頸)。

如果感興趣,請注意組合正則表達式如何具有兩個詞,「單個.之前的單個字符串_」,反之亦然。它將有六個三個字符,並且n!爲n。運行這兩個正則表達式並將AND結果比使用組合正則表達式更簡單。

在使用正則表達式時,必須總是尋找更簡單的解決方案。