2012-04-17 54 views

回答

1

matched[0]總是包含整個匹配,所以內部循環可能永遠不會終止。

+0

內部循環將終止正常。重複調用'exec()'將前進通過所有可能的匹配,直到沒有更多的匹配,然後返回null。這是外部循環,不會終止。查看我的答案,瞭解爲什麼。 – jfriend00 2012-04-17 16:49:13

+0

我應該補充說,如果正則表達式上有「g」標誌,那麼內循環將終止。 – jfriend00 2012-04-17 17:28:36

4

很難確切地知道沒有看到文本和rx的實際值,在這個循環中究竟發生了什麼取決於這些內容,但有一種理論認爲,帶有「g」標誌的.exec()方法保持從一個呼叫到下一個,以便您可以在一個循環中重複地呼叫它。爲了讓外層循環正常工作,必須從外層循環的一次迭代到下一次迭代保留該狀態。

但是,當你使用相同的正則表達式對象並使用它來搜索內部循環中不同的東西時,該狀態不會被正確保存 - 對象中的外部狀態將被內部擾動循環這也是使用相同的對象。

你雙環可能會工作,如果你使用獨立的regex對象像這樣每次循環:

while ((matched = rx1.exec(text)) != null) { 
    while((m = rx2.exec(matched[0])) != null) { 

    } 
} 

他們將需要真正獨立的regex對象,相同的正則表達式對象不是引用。

此外,matched[0]包含來自外部的搜索,你已經在你的正則表達式的外環剛匹配matched[0]整場比賽,然後你問你只是用相同的正則表達式匹配的同樣的事情再次匹配。爲什麼?你想達到什麼目的?它似乎並不像內循環會做任何有用的事情。

正如許多關於SO的問題一樣,如果您備份並告訴我們您真正想要完成的任務,我們可能會提供更多有用的信息來真正解決您的實際問題。

無論如何,我的前三段解釋了爲什麼這很容易成爲一個無限循環。

+0

你的理論絕對正確;正則表達式存儲狀態,所以用一個正則表達式在目標字符串之間切換會導致奇怪的行爲。查看https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec – apsillers 2012-04-17 16:47:37

+0

的底部我在想這可能是各州的問題。我正在研究一種語法主動式熒光筆,並且我需要在某些其他語法(例如, ,截至目前我只有一個while(...!= null),它只抓取進行着色。如果規則存在,我需要搜索內部以抓取「」。那有意義嗎? – 2012-04-17 16:58:06

+0

@MikeDepies - 沒有看到實際的正則表達式和您正在搜索的實際數據,我所能推薦的是您必須爲這兩個循環分別使用正則表達式對象。沒有這個,如果不是所有的時候,你都會得到一個無限循環。 – jfriend00 2012-04-17 17:01:33

相關問題