我已经做了两个JavaScript函数来动态创建RegExps组,这些组匹配的数字小于或大于参数中发送的数字。这些功能的目的是执行thisthis之类的操作,但动态地,我需要它来构建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("|") + ")";
}


使用示例:

var regstr = getGreaterUintRegEx(124);
// (12[5-9]|1[3-9]\d|[2-9]\d\d|\d{4,})

var regstr = getGreaterUintRegEx(500);
// (50[1-9]|5[1-9]\d|[6-9]\d\d|\d{4,})


这是创建RegExp来查找低于所需值的模式的函数:

//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("|") + ")";
}


使用示例:

var regstr = getLowerUintRegEx(498);
// (49[0-7]|4[0-8]\d|[0-3]\d\d|\d{1,2}|0)

var regstr = getLowerUintRegEx(125);
// (12[0-4]|1[0-1]\d|[1-9]\d|\d{1,2}|0)


我想使这些功能更简单,更慢。大数字需要一秒钟以上的时间。还有其他更简单的方法吗?有人知道步骤更少的鲁棒算法吗?

最佳答案

仅通过删除不必要的数据结构(每次调用都会创建几个Array和一个Function,都不需要)就可以大大提高速度。

这是对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模板字符串只是为了提高可读性。目前,常绿浏览器都支持它们,但是如果要支持IE11,则需要将它们替换为旧的'' + ''

09-19 06:53