2011-02-05 228 views
1

首先,這裏是受影響的代碼塊:安卓:Matcher.find()永遠不會返回

// (somewhere above, data is initialized as a String with a value) 
Pattern detailsPattern = Pattern.compile("**this is a valid regex, omitted due to length**", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Matcher detailsMatcher = detailsPattern.matcher(data); 
Log.i("Scraper", "Initialized pattern and matcher, data length "+data.length()); 
boolean found = detailsMatcher.find(); 
Log.i("Scraper", "Found? "+((found)?"yep":"nope")); 

我省略了正則表達式中Pattern.compile,因爲它是很長,但我知道它的工作原理與給定的數據集;或者如果沒有,反正它不會破壞任何東西。

問題是,我收到反饋I/Scraper(23773): Initialized pattern and matcher, data length 18861但我從來沒有看到「發現?」行,它只是卡在撥打find()

這是一個已知的Android錯誤?我一遍又一遍地嘗試過,只是無法讓它工作。不知何故,我認爲過去幾天有些事情因爲我的應用程序以前工作正常而被打破,而且我在過去幾天收到了該應用程序無法正常工作的幾條評論,因此它也明顯影響了其他用戶。

我該如何進一步調試呢?

+0

嗨Ricket,你介意分享你的解決方案嗎?當正則表達式找不到任何匹配時,我的代碼也會掛起。我的數據只有幾百個字符長,順便說一句。 – Zarah 2011-03-08 07:53:02

+0

@Zarah我的應用程序刮擦網頁數據,網頁已經改變,所以我只是更新它,以便它總是再次找到數據。然而,我有大量的非貪婪搜索(`。*?`),我相信那些簡單地擴展find()方法需要很長時間(看起來是無限的)。如果正則表達式有可能不匹配,請確保它儘可能優化。我認爲這裏的問題不是它掛起,而是它試圖在每個排列中使用正則表達式,即使在一個小樣本上也很耗時。 – Ricket 2011-03-08 13:36:32

回答

2

您試圖解析的字符串有多長? 正在嘗試匹配的正則表達式有多長和多複雜?

您是否試圖將您的正則表達式分解爲更簡單的位?一個接一個地添加位會讓你看到它什麼時候崩潰,也許是爲什麼。

0

使一些RE像[a-zA-Z] *將它作爲參數傳遞給compile(),這裏這個例子只允許字符小的& cap。

閱讀我的blogpost on android validation瞭解更多信息。

2

有些正則表達式可能需要非常非常長的時間來評估。特別是,有很多量詞的正則表達式可能會導致正則表達式引擎執行大量的回溯來探索輸入字符串可能匹配的所有可能方式。如果它失敗了,它必須探索所有這些可能性。

(這裏有一個例子:

regex = "a*a*a*a*a*a*b";   // 6 quantifiers 
input = "aaaaaaaaaaaaaaaaaaaa"; // 20 characters 

一個典型的正則表達式引擎將在20^6字符比較的區域做決定,輸入字符串不匹配了。)

如果您向我們展示了正則表達式和你想匹配的字符串,我們可以給出更好的診斷,並可能提供一些替代方案。但是,如果您試圖從HTML中提取信息,那麼最好的解決方案可能是根本不使用正則表達式。有HTML解析器專門用於處理現實世界的HTML。

0

我有同樣的問題,我解決了它取代所有的wildchart .[\s\S]。我真的不知道爲什麼它爲我工作,但它確實。我來自Javascript世界,我知道在那裏表達式被評估更快。

相關問題