2010-11-05 105 views
3

我想關於Java下面的代碼:這個正則表達式有什麼問題?

String test = "http://asda.aasd.sd.google.com/asdasdawrqwfqwfqwfqwf"; 
String regex = "[http://]{0,1}([a-zA-Z]*.)*\\.google\\.com/[-a-zA-Z/_.?&=]*"; 
System.out.println(test.matches(regex)); 

它做幾分鐘的工作沒有結果(在那之後我殺了VM)。 任何人都可以幫助我嗎?

順便說一句:你會推薦我做些什麼來加速weblink-testng正則表達式的未來?

回答

7

[http://]是一個字符類,這意味着從該組的那些字符中的任一個

只要將這些特定的方括號關閉,如果它必須http://開頭。如果它是可選的,則可以使用(http://)?

一個明顯的問題是,你要尋找的序列([a-zA-Z]+.)*\\.google - 這將做很多回溯由於是裸.這意味着「任何字符」,而不是你想要的文字句點。

但是,即使你與你意思([a-zA-Z]+\\.)*\\.google,你還有一個問題,取代它 - 那麼這將立即google以前需要兩個.字符。你應該代之以:

String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*"; 

立即返回我一個true比賽。

請記住,這目前需要/google.com的末尾。如果這是一個問題,這是一個小問題,但我已經把它留在那裏,因爲你已經在原始正則表達式中使用了它。

+0

您可以使用(i?)[a-z]而不是[a-zA-Z],它會忽略 – ant 2010-11-05 09:18:15

4

您試圖將方案與使用方括號的字符類相匹配。這意味着只有零個或其中一個字符。你想要一個帶括號的子模式。您也可以將{0,1}更改爲?

此外,您應該刪除google\\.com之前的時間段,因爲您已經在您的正則表達式的子域子模式中尋找一段時間。正如赫魯維姆指出的那樣,你也忘了逃避那個時期。

String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*"; 
+0

即使這種改變並不能阻止Java在很長一段時間內在正則表達式中徘徊。 – 2010-11-05 08:08:19

+0

在第一個'*'之後加上'+'。 – tchrist 2010-11-05 12:16:00

3

([a-zA-Z]*.)部分,您需要轉義.(因爲現在它意味着「所有字符」)或將其刪除。

+0

罷工!這是導致「無限循環」行爲的錯誤。接得好! (使用ideone驗證您的解決方案) – 2010-11-05 08:12:41

1

假設您修復了([a-zA-Z]*\\.),您需要將*更改爲+,以使部件變爲([a-zA-Z]+\\.)。否則,你會接受http://...google.com,這是無效的。

2

正則表達式有兩個問題。

第一個很容易,正如其他人所提到的。你需要匹配「http://」作爲子模式,而不是字符類。將括號更改爲括號。

第二個問題導致性能很差。它導致正則表達式反覆回溯,試圖匹配模式。

你要做的是匹配零個或多個子域,它們是一組字母后跟一個點。既然你想明確地匹配這個點,就不要使用點。還要刪除「google」前面的點,以便匹配「http://google.com/etc」(即,在Google面前沒有前導點)。

所以,你的表情就變成了:

String regex = "(http://){0,1}([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*"; 

運行在你的榜樣這個表達式只需要一秒鐘的一小部分。

1

通過google.com之前的分組部分我假設您正在尋找URL主機名的一部分。我認爲rexep是一個強大的工具,但你可以簡單地使用URL Java class。有getHost()方法。然後,您可以檢查主機名是否以google.com結尾並將其拆分或僅使用主機名的簡單正則表達式。

URL url = new URL("http://asda.aasd.sd.google.com/asdasdawrqwfqwfqwfqwf"); 
String host = url.getHost(); 
if (host.endsWith("google.com")) 
    { 
    String [] parts = host.split("\\."); 
    for (String s: parts) 
     System.out.println(s); 
    } 
+0

這取決於是否有網絡連接以及性能要求。 – cherouvim 2010-11-05 08:30:15

+0

我測試了它沒有直接HTTP網絡連接(代理與密碼),這個URL不能在瀏覽器中工作,但我能夠使用URL類。你能否根據網絡連接向我提供一些關於URL類的更多信息? – 2010-11-05 08:43:56

+0

我用正則表達式測試了性能 (http://)?([a-zA-Z0-9] + \\。)* google((syndication)|(--analytics))?\\。com /[-a-zA-Z0-9/_.?&=]* 和圖案 google.com google-analytics.com googlesyndication.com 它需要985毫秒的正則表達式來檢查100個000鏈接,而URL需要156毫秒 – 2010-11-05 10:02:46

相關問題