[英]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.