是否有任何方法或任何库可以从我想要匹配的一组字符串中计算JS RegEx?
例如,我有这组字符串:
generate_series()
abc123
并生成abc212
?
或者这套:
abc\d\d\d
aba111
abb111
并生成abc
?
请注意,我不需要非常精确的RegEx,我只想要一个可以执行字符串的工作,ab.
和.
答案 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*
...
等等。话虽如此,你可以找到符合条件的 语法。一种方法是简单地强制每个输入项的相似性和差异性。所以用第二个例子做到这一点:
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