regex 有没有可能有一个从1到n的通用正则表达式?

yptwkmov  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在寻找一个通用的正则表达式公式,以找出一个数字是否低于一定的限制
我已经尝试了0 - 100这样的范围,比如在这个article中,尽管我找不到关于如何找到一个通用方法的解释,例如给定一个变量n。

t9aqgxwy

t9aqgxwy1#

  • 从始终有效的长度的数字串开始,即那些严格短于极限的。[1-9][0-9]{0,n⁻⁻},其中 *n * 比上界的长度小2。(如果 n = 1,则跳过此。)
  • 然后添加一位数前缀的范围,其中上限长度的所有值都有效:[1-b⁻][0-9]{n⁻⁻},其中 *B * 是第一个数字之前的数字。(如果第一个数字是1,或者如果 n = 1,跳过此。如果 n = 2,则不必发出[0-9]{0}。)
  • 最后,匹配从剩余有效数字开始的字符串:``b(?:…),其中是最后两个步骤的一个微小变化,递归地应用于匹配长度为 n − 1的固定宽度数字串(如果 n = 1,为空,我们完成了,所以不用麻烦发出(?:))在从0开始并以通过从原始上限中移除第一位数而获得的上限结束的新范围中:
  • 从一位数前缀的范围开始,其中上限长度的所有值都有效:[0-b⁻][0-9]{n⁻⁻}
  • 并匹配以剩余有效数字开头的字符串:``b(?:…) .

典型的格式,如前导零(0*)/符号,可以安全地添加到按照这种方法组装的正则表达式的开头,从某种意义上说,没有任何灾难性的回溯问题。

/**
 * @param {string} bound - Upper bound, inclusive.
 */
const integers1ToNRegex = (bound) => {
  if (typeof bound !== "string" || !/^\d+$/.test(bound)) {
    throw new TypeError("invalid non-negative integer decimal string");
  }
  bound = bound.replace(/^0+/, "");
  if (bound === "") {
    return "(?!)";
  }
  if (bound.length === 1) {
    return `[1-${bound}]`;
  }
  let regex = `[1-9][0-9]{0,${bound.length - 2}}`;
  if (+bound.charAt(0) > 1) {
    regex += `|[1-${+bound.charAt(0) - 1}][0-9]{${bound.length - 1}}`;
  }
  regex += `|${bound.charAt(0)}`;
  for (let i = 1; i < bound.length - 1; i++) {
    const digit = +bound.charAt(i);
    const indent = "\n" + "  ".repeat(i);
    regex += `(?:${indent}`;
    if (digit > 0) {
      regex += `[0-${digit - 1}][0-9]{0,${bound.length - 1 - i}}|`;
    }
    regex += digit;
  }
  regex += `[0-${bound.at(-1)}]`;
  return regex + ")".repeat(bound.length - 2);
};

const boundInput = document.getElementById("bound");
const regexOutput = document.getElementById("regex");

const update = () => {
  if (boundInput.reportValidity()) {
    regexOutput.value = integers1ToNRegex(boundInput.value);
  } else {
    regexOutput.value = "";
  }
};

boundInput.addEventListener("input", update, {passive: true});
update();
#regex {
  display: block;
  font-family: monospace;
  white-space: pre;
}
<input type="number" id="bound" min="1" value="1234" required>

<output id="regex" for="bound"></output>

相关问题