我正在寻找一个通用的正则表达式公式,以找出一个数字是否低于一定的限制我已经尝试了0 - 100这样的范围,比如在这个article中,尽管我找不到关于如何找到一个通用方法的解释,例如给定一个变量n。
t9aqgxwy1#
[1-9][0-9]{0,
}
[1-
][0-9]{
[0-9]{0}
(?:…)
…
(?:)
[0-
典型的格式,如前导零(0*)/符号,可以安全地添加到按照这种方法组装的正则表达式的开头,从某种意义上说,没有任何灾难性的回溯问题。
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>
1条答案
按热度按时间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}
。)(?:…)
,其中…
是最后两个步骤的一个微小变化,递归地应用于匹配长度为 n − 1的固定宽度数字串(如果 n = 1,…
为空,我们完成了,所以不用麻烦发出(?:)
)在从0开始并以通过从原始上限中移除第一位数而获得的上限结束的新范围中:[0-
b⁻][0-9]{
n⁻⁻}
(?:…)
.典型的格式,如前导零(
0*
)/符号,可以安全地添加到按照这种方法组装的正则表达式的开头,从某种意义上说,没有任何灾难性的回溯问题。