前不久同事詢問我js裏面怎麼給正則中添加變量的問題,遂寫篇博客記錄下。
一、字面量
其實當我們定義一個字符串,一個數組,一個對象等等的時候,我們習慣用字面量來定義,例如:
var s = "string"; var a = [1,2]; var o = {};
如果需要加入變量,那也是十分簡單的事情,比如:
var v = "bl"; var s = "string" + v; //"stringbl" var a = [1,v]; //[1,"bl"] var o = {first : v}; //{first : "bl"}
但是,如果碰到了用正則字面量,貌似一切就沒這麼好了。
var v = "bl"; var re = /^\d+$/gim;
這時,假如你想給\d+後面加入v這個變量,你會發現,沒法弄。因爲無論你怎麼寫,都會被當作正則的一部分來處理。
二、構造函數
在JS的世界中。除了null,undefined。其餘皆是對象。
不過,這裏肯定有人說,string、number、boolean怎麼會是對象呢。
其實雖然我上面那句話不準確,但確實是最直觀的感受。因爲string、number、boolean在你用的時候,會默認的被相應的基本包裝類型給轉換成對象。
然後我們又知道,在JS中,所有的對象都是通過構造函數來生成的。
那麼,我們就可以用構造函數來代替字面量定義法,例如:
var s = new String("string"); //String對象,toString()後爲"string" var a = new Array(1,2); //[1,2] var o = new Object(); //{}
相應的,我們也可以用構造函數來生成正則表達式
var re = new RegExp("^\\d+$","gim"); //注意,反斜槓需要轉義
那麼,給它加變量,就和我們前面寫的給字符串加變量一樣了。
var v = "bl"; var re =new RegExp("^\\d+" + v + "$","gim"); // re爲/^\d+bl$/gim
至此,最初的問題問題也完全解決了。
另外,還有一種方法是用過eval動態執行一段字符串的方法,不過我覺得從各方面來說,都屬下策。
var re = eval("/^\\d+" + v + "$/gim")