簡體   English   中英

Javascript:RegExp.compile()有什么意義?

[英]Javascript: what's the point of RegExp.compile()?

我有一種情況,我希望從用戶獲得一個正則表達式,並針對幾千個輸入字符串運行它。 在手冊中,我發現RegExp對象有一個.compile()方法,用於加速這種情況。 但是,如果我已經在構造函數中傳遞了它們,為什么我必須再次將regexp字符串傳遞給它? 也許構造函數執行compile()本身?

不推薦使用RegExp().compile()方法 它與構造函數基本相同,我假設它是不推薦使用的原因。 你現在應該只需要使用構造函數。

換句話說,您曾經能夠這樣做:

var regexp = new RegExp("pattern");
regexp.compile("new pattern");

但是現在它與簡單地調用沒有任何不同:

var regexp = new RegExp("pattern");
regexp = new RegExp("new pattern");

使用Opera 11,運行RegExp.compile()實際上會導致錯誤。

顯然,當Opera“編譯”一個正則表達式時,它以正斜杠包裝re.source字符串(例如re.source == "^(.)"變為"/^(.)/" )。 如果你手動編譯正則表達式,Opera不會識別這個事實並繼續編譯它( re.source變為"//^(.)//" )。 每次編譯都會產生一組額外的正斜杠,這會改變正則表達式的含義並導致錯誤。

如果你使用/ ,你必須首先編譯你的正則表達式使用它,試試這個:

 var regex=new RegExp('/[a-zA-Z]/') console.log("not compiled with escape /", regex.test("ciao") ) regex.compile() console.log("compiled", regex.test("ciao") ) var regex=new RegExp('[a-zA-Z]') console.log("not compiled, but no escape /", regex.test("ciao") ) 

據我所知,所有RegExp.compile都會替換RegExp對象的底層正則表達式。 我認為編譯過去可能有價值,但所有現代JS引擎在第一次調用時“編譯”正則表達式並緩存“編譯”版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM