2013-08-26 44 views
0

我已經寫了下面的正則表達式,這樣,這個正則表達式將不匹配輸入;它正在工作,但循環運行無限的時間。如何解決這個問題正則表達式檢查運行無限時間

String originalRegex ="(?s)\\00|\\+ADw-|\\+AD4-|%[0-9a-f]{2}|System[.][a-z]|javascript\\s*:|>(?:\".*|^'.*|[^a-z]'.*|'[^a-z].*|')[-+\\*/%=&|^~\"']|\\?.*<:|\\(\\s*[a-z]{2,}\\.[a-z]{2,}.*\\)"; 
String xmlData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration xmlns=\"http://www.example.com/api/2.2\" timestamp=\"str111\" version=\"2.2\"><domain account=\"4af17966-c841-4b97-a94a-edd7a0769\" /></configuration>"; 
String freetext = ">(?:\".*|^'.*|[^a-z]'.*|'[^a-z].*|')[-+\\*/%=&|^~\"']|\\?.*<:"; 
final Pattern PATTERN_1 = Pattern.compile(freetext); 
Matcher matcher = PATTERN_1.matcher(xmlData); 

while (!matcher.find()) { 
    System.out.println("Good Job"); 
} 
+1

哪種語言?如果提到這一點,原因可能很明顯,因爲有人可以查找'.find()'方法的文檔。 –

+0

這是用Java編寫的 –

+5

你不應該使用正則表達式來解析XML。 – christopher

回答

4

Java的.find()方法返回「當且僅當輸入序列的子序列此匹配器模式匹配」 - see the documentation。在你的代碼,如果沒有找到匹配,則:

while (!matcher.find()) { 
    System.out.println("Good Job"); 
} 

計算結果爲:

while (!false) { 
    System.out.println("Good Job"); 
} 

,或者更簡單:

while (true) { 
    System.out.println("Good Job"); 
} 

因此,您的無限循環。

2

Matcher.find()

嘗試的javadoc發現 模式匹配的輸入序列的下一個子。

該方法始於此匹配的區域的開始,或者,如果該方法的 以前的調用是成功的,並且匹配具有 不是因爲被複位,在不被 以前匹配所匹配的第一個字符。

如果匹配成功,則可以通過 開始,結束和組方法獲取更多信息。

返回:當且僅當輸入序列的子序列 匹配此匹配器模式

理論上,應該使用

while(matcher.find()) 

上面會嘗試匹配輸入字符串不斷根據在正則表達式模式。

while循環要麼,如果你進入無限循環,如果它是不能夠找到一個模式,或者如果找到匹配,將退出循環,無論哪種方式沒有利用其

while(!matcher.find()) 

然而要檢查,如果它不匹配,那麼你可以使用if

if(!matcher.find()){ 
    //No Matches 
} else { 
    //Atleast one Match 
} 

一個提示。如果您試圖解析XML,則Regex可能不適合您。嘗試使用許多可用的XML解析器之一。