js正則表達式中存在變量

前不久同事詢問我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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章