我定义了一些简单的正则表达式为:

var PIPE= /^\|/;
var START= /^{{/;

var s= "{{hello";

var tSet={PIPE:true, START:true}
var test= "";

for(t in tSet){
    if(s.match(t)!=null){
        test= test+ s.match(t);
    }
}


但是它从不匹配任何东西,所以我寻找了t的类型

typeof t;  //returns string


但是t是一个字符串。如何确定t是包含正则表达式的变量?我试过了

for(t in tSet){
    var b= new RegExp(t);
    if(s.match(b)!=null){
        test= test+ s.match(b);
    }
}


但它仍然不起作用。我该如何打字,使其将t识别为正则表达式而不是字符串?

最佳答案

您的代码有两个问题。首先是tSet对象的初始化。您正在使用字符串->布尔对创建对象。 JSON表示形式为:

{
    "PIPE":true,
    "START":true
}


接下来,当使用for (x in y)遍历对象时,x是对象中的每个键,而不是值。

您可以使用tSet[t]来获取布尔值。

为了从变量名中获取正则表达式值,窗口对象允许这样做:window[t]

接下来,您最终得到:

var PIPE= /^\|/;
var START= /^{{/;

var s= "{{hello";

var tSet={PIPE:true, START:true}
var test= "";

for(t in tSet){
    if (!tSet[t]) { // If the value is false
        continue; // Skip this one and continue to the next
    }
    if(s.match(window[t])!=null){
        test = test + s.match(window[t]);
    }
}


但是,此时有一种更简单的方法,我认为这可能就是您最初想做的。假设您不需要布尔值,则应使用一个数组:

var PIPE = /^\|/;
var START = /^{{/;

var s = "{{hello";

var tSet = [PIPE, START] // This creates an array with the values of the variables.
var test = "";

for (var i = 0; i < tSet.length; i++) { // For each regex in the array
    if(s.match(tSet[i]) != null){
        test = test + s.match(tSet[i]);
    }
}

09-25 16:23