1

假设我有以下正则表达式:

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

我有另一个变量:

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

如何使我可以将列表中的单词附加到 someregex 以便“myregex”导致:

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

2 回答 2

4

我倾向于尝试从原始单词列表开始寻找另一种解决问题的方法,但是如果您确实需要附加到现有单词列表,则正则表达式实例具有将表达式源作为字符串返回的source属性,并且接受字符串的构造函数。所以你可以这样做:

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

这将丢失标志,因此您可能希望使用构造函数的第二个参数,基于原始正则表达式的, ,等属性RegExp构建或任何字符串。(或者一个技巧是使用和抓取你返回的字符串中最后一个字符后面的任何字符,并将它们作为第二个参数提供。)所以上面的更完整版本可能是:"gi"globalignoreCasemultilinerex.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);

实例| 来源

另请注意,如果您的单词中包含正则表达式特有的字符(.\/$等),则上述内容会中断。字母数字很好,否则您可能想要使用其中一种RegExp.escape在野外出现的各种实现(遗憾的是标准中没有)并使用它来转义单个单词。

于 2013-01-13T06:46:25.497 回答
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);

我不知道哪种方式更快。

于 2013-01-13T07:15:38.223 回答