从一组字符串生成JS Regex

时间:2015-09-15 03:42:55

标签: javascript regex string set

是否有任何方法或任何库可以从我想要匹配的一组字符串中计算JS RegEx?

例如,我有这组字符串:

  • generate_series()
  • abc123

并生成abc212

或者这套:

  • abc\d\d\d
  • aba111
  • abb111

并生成abc

请注意,我不需要非常精确的RegEx,我只想要一个可以执行字符串的工作,ab..

2 个答案:

答案 0 :(得分:2)

并非没有产生某个Grammar的所有可能结果,其中一些是无限的。这意味着在一般情况下,从给定的输入集中找到特定的想要的语法是不可能的。即使在您的情况下,您也需要尽可能地生成语法(正则表达式),以便准确了解您正在寻找的正则表达式。例如第一个集合,有几个可以匹配它的正则表达式,其中一些可能是:

abc[0-9][0-9][0-9]
abc[1-2][0-5][2-3]
abc[1-2][0-5][2-3]a*
abc\d*
abc\d+
abc\d+a*b*c*
...

等等。话虽如此,你可以找到符合条件的 语法。一种方法是简单地强制每个输入项的相似性和差异性。所以用第二个例子做到这一点:

  • aba111
  • abb111
  • ABC

ab部分对所有部分都是相同的,所以我们从ab开始作为正则表达式。然后下一个字符可以是a, b or c,因此我们可以说(a|b|c)。然后1 or empty三次。这将导致:

ab(a|b|c)(1|)(1|)(1|)

这是一个正确的正则表达式,但也许不是你想要的那个。

答案 1 :(得分:0)

可能这太简单了,但你可以使用它,

var arr = ['abc121','abc212','cem23'];
var regex_arr = [];

arr.sort(function(a, b){return -a.length+b.length;});
for(var i in arr[0]){
    for(var j in arr){
        if(i>=arr[j].length){
            regex_arr[i] = {value:'',reg:'*',use_self:false};
        }else{
            var c = arr[j][i];
            var current_r = '.';

            if(isNaN(c)){
                if(/^[A-Za-z]$/.test(c)){
                    current_r = '\\w';
                }else{
                    current_r = '\\W';
                }
                //... may be more control
            }else{
                current_r = '\\d';
            }
            if(!regex_arr[i]){
                regex_arr[i] = {value:c,reg:current_r,use_self:true};
            }else{
                if(regex_arr[i].value!=c){
                    if(regex_arr[i].reg!=current_r){
                        regex_arr[i].reg = '.';
                    }
                    regex_arr[i].use_self = false;
                    regex_arr[i].value = c;
                }
            }
        }
    }
}
var result = '';
for(var i in regex_arr){
    if(regex_arr[i].use_self){
        result += regex_arr[i].value;
    }else{
        result += regex_arr[i].reg;
    }
    if(regex_arr[i].reg=='*'){
        break;
    }
}
console.log("regex = "+result);
for(var i in arr){
    var r = new RegExp(result);
    console.log(arr[i] + ' = '+r.test(arr[i]));
}

结果

regex = \w\w\w\d\d*
abc121 = true
abc212 = true
cem23 = true