Javascript 动态创建RegExps组以匹配小于或大于所需值的模式
我制作了两个Javascript 动态创建RegExps组以匹配小于或大于所需值的模式,javascript,regex,numbers,Javascript,Regex,Numbers,我制作了两个JavaScript函数来动态创建regexp组,这些组匹配的数字小于或大于参数中发送的数字。这些函数的目的是做一些类似或但动态的事情,我需要它用于构建RegExps的应用程序,此代码生成一个与特定数字组匹配的组,稍后您可以使用返回的组来完成最终的RegExp 以下是创建RegExp以查找大于所需值的模式的函数: //Find greater than numbers function getGreaterUintRegEx(n) { var s = String(n); v
JavaScript
函数来动态创建regexp
组,这些组匹配的数字小于或大于参数中发送的数字。这些函数的目的是做一些类似或但动态的事情,我需要它用于构建RegExps
的应用程序,此代码生成一个与特定数字组匹配的组,稍后您可以使用返回的组来完成最终的RegExp
以下是创建RegExp
以查找大于所需值的模式的函数:
//Find greater than numbers
function getGreaterUintRegEx(n) {
var s = String(n);
var t = s.length,
a = [];
for (var i = 1; i < t + 1; i++) {
switch (s.charAt(t - i)) {
case "9":
a.push((Number(s.slice(0, t - i)) + 1) + "0" + (new Array(i)).join("\\d"));
break;
case "8":
a.push(s.slice(0, t - i) + "9" + (new Array(i)).join("\\d"));
break;
default:
a.push(s.slice(0, t - i) + "[" + (Number(s.charAt(t - i)) + 1) + "-9]" + (new Array(i)).join("\\d"));
}
}
a.push("\\d{" + (t + 1) + ",}");
a = a.filter(function(s, i) {
return a.indexOf(s) == i;
});
return "(" + a.join("|") + ")";
}
//Find lower than numbers
function getLowerUintRegEx(n) {
if (n == 0) return false;
if (n == 1) return "(0)";
if (n > 0 && n < 10) return "[0-" + (n - 1) + "]";
var s = String(n);
var t = s.length,
a = [];
for (var i = 1; i < t + 1; i++) {
switch (s.charAt(t - i)) {
case "0":
a.push(((s.slice(0, t - i) == "1") ? "" : (Number(s.slice(0, t - i)) - 1)) + "9" + (new Array(i)).join("\\d"));
break;
case "1":
a.push("[1-9]" + (new Array(i - 1)).join("\\d"));
break;
default:
a.push(s.slice(0, t - i) + "[0-" + (Number(s.charAt(t - i)) - 1) + "]" + (new Array(i)).join("\\d"));
}
}
if (t - 1 > 1) a.push("\\d{1," + (t - 1) + "}");
a.push("0");
a = a.filter(function(s, i) {
return a.indexOf(s) == i;
});
return "(" + a.join("|") + ")";
}
下面是创建RegExp
以查找低于所需值的模式的函数:
//Find greater than numbers
function getGreaterUintRegEx(n) {
var s = String(n);
var t = s.length,
a = [];
for (var i = 1; i < t + 1; i++) {
switch (s.charAt(t - i)) {
case "9":
a.push((Number(s.slice(0, t - i)) + 1) + "0" + (new Array(i)).join("\\d"));
break;
case "8":
a.push(s.slice(0, t - i) + "9" + (new Array(i)).join("\\d"));
break;
default:
a.push(s.slice(0, t - i) + "[" + (Number(s.charAt(t - i)) + 1) + "-9]" + (new Array(i)).join("\\d"));
}
}
a.push("\\d{" + (t + 1) + ",}");
a = a.filter(function(s, i) {
return a.indexOf(s) == i;
});
return "(" + a.join("|") + ")";
}
//Find lower than numbers
function getLowerUintRegEx(n) {
if (n == 0) return false;
if (n == 1) return "(0)";
if (n > 0 && n < 10) return "[0-" + (n - 1) + "]";
var s = String(n);
var t = s.length,
a = [];
for (var i = 1; i < t + 1; i++) {
switch (s.charAt(t - i)) {
case "0":
a.push(((s.slice(0, t - i) == "1") ? "" : (Number(s.slice(0, t - i)) - 1)) + "9" + (new Array(i)).join("\\d"));
break;
case "1":
a.push("[1-9]" + (new Array(i - 1)).join("\\d"));
break;
default:
a.push(s.slice(0, t - i) + "[0-" + (Number(s.charAt(t - i)) - 1) + "]" + (new Array(i)).join("\\d"));
}
}
if (t - 1 > 1) a.push("\\d{1," + (t - 1) + "}");
a.push("0");
a = a.filter(function(s, i) {
return a.indexOf(s) == i;
});
return "(" + a.join("|") + ")";
}
我想让这些功能更简单,速度也更慢。使用大数字需要一秒钟以上的时间。还有其他更简单的方法吗?有人知道一个步骤少的稳健算法吗?你的方法很复杂。而且是有限的
function getInts(str){
return String(str).match(/[+-]?\d+/g).map(Number);
}
function greaterThan(w){
return function(v){ return v > w }
}
function lowerThan(w){ //
return function(v){ return v < w }
}
getInts(someString).filter( greaterThan(473) )
函数getInts(str){
返回字符串(str).match(/[+-]?\d+/g).map(Number);
}
大于(w)的函数{
返回函数(v){return v>w}
}
函数lowerThan(w){//
返回函数(v){return vvar is = (function(is){
for(var key in is) is[key] = Function("w", "return function(v){return v " + is[key] + " w}");
return is;
})({
eq: "===",
neq: "!==",
gt: ">",
lt: "<",
gteq: ">=",
lteq: "<="
});
is.typeof = function(w){ return function(v){ return typeof v === w }};
getInts(someString).filter( is.lt(92) );
var is=(函数(is){
对于(is中的var key)is[key]=函数(“w”,“返回函数(v){return v”+is[key]+“w}”);
回报是;
})({
等式:“=”,
neq:“!==”,
gt:“>”,
lt:“=”,
lteq:“这不是我解决问题的方法,但您并不是在寻找更好的解决方案,而是希望对您的代码、建议和优化进行审查,以提供与原始代码相同的功能(即工作代码)
无论如何,下面是一个建议。代码更具可读性,我无意测试它的性能
var reduceRight=Function.prototype.call.bind(Array.prototype.reduceRight);
//查找大于数字的值
函数getgreateruintreex(n){
var s=字符串(n);
var t=s.长度-1;
var a=减速器右侧(s,功能(acc,v,i){
var x=s.切片(0,i);
如果(v=='9'){
x=数字(x)+1+'0';
}else if(v=='8'){
x+='9';
}否则{
x+='['+(数字(v)+1)+'-9];
}
acc.push(x+'\\d'.重复(t-i));
返回acc;
}, []);
a、 推送('\\d{'+(t+2)+',}');
返回“(”+a.join(“|”)+”)”;
}
//查找大于的数字:原始
函数getgreateruintreex1(n){
var s=字符串(n);
var t=s.长度,
a=[];
对于(变量i=1;i
只需删除不必要的数据结构(每次调用都会创建几个数组和一个函数,不需要任何函数),就可以大大提高速度
下面是对getGreaterUintRegEx的重写:
function getGreaterUintRegEx(n) {
var nStr = String(n);
var len = nStr.length;
var result = '(';
var ds = '';
var i;
for (i = len - 1; i >= 0; i--) {
switch (nStr.charAt(i)) {
case '9': result += `${+nStr.slice(0, i) + 1}0${ds}|`; break;
case '8': result += `${nStr.slice(0, i)}9${ds}|`; break;
default: result += `${nStr.slice(0, i)}[${+nStr.charAt(i) + 1}-9]${ds}|`;
}
ds += '\\d';
}
return `${result}\\d{${len + 1},})`;
}
我使用ES6模板字符串只是为了可读性。目前evergreen浏览器都支持这些字符串,但如果您想支持IE11,您需要将它们替换为旧的'+'
。有什么理由使用RegExp而不是简单地拆分字符串并转换为数字?字符串可以是那个或任何其他文本(该字符串只是一个示例),RegExp
可以在任何类型的文本中查找模式。因此该字符串可以是d131dd02c5e6eec4 693d9a0698aff95c 2fcab58712467eab 4004583eb8fb7f89
,如果是getLowerInTregex(500),您会期望得到什么结果
?@Xotic750当您将500作为参数传递时,函数总是返回相同的值,它只创建如下字符串(499 | 49\d |[0-4]\d\d | \d{1,2}| 0)。此字符串
与0-499之间的数字匹配。您发布的字符串
可以作为示例,具体取决于情况和我要提取的匹配项,方法将是一种或另一种。例如,如果我要提取所有整数(边上没有数字)小于500的字符串
我可以做到这一点:例如,对于前导为零的数字字符串06
,或者像54.1
或0.21
这样的浮点数字符串,你会有什么期望呢?我对你的规格非常不确定。请阅读我的帖子。我不想搜索单个数字模式(这不是我的意图),我想得到一个RegExp
来向用户显示它,然后这个RegExp
组可以用来符合一个更复杂的表达式。我知道这很复杂,我正在寻找一种不太复杂的方法来从所需的数字中得到一个RegExp
组。这不是我解决问题的方法如果你有更好的解决办法,请给我(我在问题中要求过)。我从来没有说过我不想要另一个解决方案,我只是说我需要一个RegExp
组,而不是一个替换函数,因为我的应用程序需要一个RegExp
,如果结果是RegExp
组的文本表示形式匹配一个小于或大于另一个的数字,那么任何解决方案都将是w