2013-01-13 33 views
1

說我有以下的正則表達式:如何在javascript中追加到現有的正則表達式?

var myregex = /^(i|blah|ho)$/ 

我有另一個變量:

var list = ["some","another"] 

如何讓這樣我可以追加在列表中的話someregex使得「myregex」結果:

var myregex = /^(i|blah|ho|some|another)$/ 
+1

你需要一個正則表達式嗎?使用'indexOf' –

回答

4

我會傾向於嘗試尋找另一種方式接近開頭的單詞原始列表中的問題,但如果你真的需要追加到現有的正則表達式實例有一個source property,它返回表達式的來源作爲字符串和接受字符串的構造函數。所以,你可以這樣做:

var rex = /^(i|blah|ho)$/; 
var list = ["some","another"]; 
rex = new RegExp(rex.source.replace(")$", "|" + list.join("|") + ")$"); 

這將失去標誌,所以你可能要使用的第二個參數的構造函數RegExp,建設"gi"或者基於任何字符串globalignoreCasemultiline等。原始正則表達式的屬性。 (或者對於一個黑客就是用rex.toString(),抓住任何字符按照最後/你回來字符串中,並提供這些作爲第二個參數),因此,一個較爲完整的版本上面可能是:

// (I added a flag to this one to check that the flags processing worked) 
var rex = /^(i|blah|ho)$/i; 
var list = ["some","another"]; 
var flags = rex.toString(); 
var index = flags.lastIndexOf("/"); 
flags = flags.substring(index + 1); 
rex = new RegExp(rex.source.replace(")$", "|" + list.join("|") + ")$"), flags); 

Live Example | Source

還要注意的是,如果你的話有他們特殊規則表達式(.\/$等)字符,上面會破裂。字母數字是好的,否則你可能想要使用RegExp.escape的各種實現中的一種(可惜標準中沒有),並用它來逃避單個單詞。

+2

好黑客似乎更好!但仍然是一個黑客。 –

+0

雖然這是一種方式,但我不知道爲什麼OP不會從一開始就將所有單詞放入正則表達式。這種方法的另一個潛在的問題是單詞列表還沒有被正則表達式轉義,所以如果單詞包含特殊字符,可能會導致錯誤。 – nhahtdh

+0

我並不完全確定,但我認爲在這些字符前加\應該是足夠的:'.',\,'|','*',''','+','(',')' ,'''','''','','''' – nhahtdh

0

有兩種方法可以做到這一點。

1)通過陣列的concat

var myregex = /^(i|blah|ho)$/; 
var list = ["some","another"]; 

var _newList = myregex.toString().match(/([a-z]+)/gi).concat(list); 

var myNewRegEx = new RegExp("/^(" + _newList.join('|') + ")$/"); 

2.)通過正則表達式替換

var myregex = /^(i|blah|ho)$/; 
var list = ["some","another"]; 

var _t = myregex.toString().replace(/\)/, '|' + list.join('|') + ')'); 
var myNewRegEx = new RegExp(_t); 

不知哪個方向是更快。

相關問題