我搜索了很多,找不到这个RegExp的解决方案(我不得不说我在Reg。表达方面不是很有经验)。
我想测试1到36之间的数字,不包括0和37及以上。
到目前为止我所得到的几乎是有效的(它不接受17,18,19,27,28,29)......
^[1-9]{1}$|^[1-3]{1}[0-6]{1}$|^36$;
有人能帮助我吗?
答案 0 :(得分:26)
你知道\d
,对吧?
^([1-9]|[12]\d|3[0-6])$
在控制台中尝试:
function test() {
for(var i = 0; i < 100; i++) {
if (/^([1-9]|[12]\d|3[0-6])$/.test(i.toString()) != (i >= 1 && i <=36)) {
document.write(i + "fail");
}
else
document.write(i + "pass");
document.write("<br/>");
}
}
答案 1 :(得分:14)
^[0-9]|[0-2][0-9]|3[0-6]$
以下是它的细分:
[0-9]
= 0-9 |
= OR [0-2][0-9]
=的任何数字'1'或'2',然后是0-9 |
= OR 3[0-6]
='3'的任何数字,接着是0-6的任何数字。
由于@mu太短,所以使用整数比较将更容易,更有效。这是一个示例函数:
function IsInRange(number)
{
return number > 0 && number < 37;
}
答案 2 :(得分:4)
试试这个:
^[1-9]$|^[1-2][0-9]$|^3[0-6]$
(1到9之间的所有1位数字,所有1x和2x数字,以及30到36之间的3x数字)。
答案 3 :(得分:2)
我不确定为什么所有答案都会重复在每个条件之前和之后添加边界(^
和$
)的错误。但你只需要这样做:
^[1-9]|[1-2][0-9]|3[0-6]$
我还创建了一个JavaScript / Node.js库to-regex-range,以简化这样的范围创建。
答案 4 :(得分:1)
答案 5 :(得分:1)
尝试^[1-9]$|^[1-2]\d$|^3[0-6]$
答案 6 :(得分:0)
纯粹出于学术原因,我将添加一个独特且准确的模式。
/^(3[0-6]?|[12]\d?|[4-9])$/
模式中有三个分支:
如果按照我的模式具有效率优势(不是该任务可能会浪费大量资源,除非您进行了数千次此类评估),就可以归结为没有多余检查的事实在模式中。
对正则表达式引擎可能没有任何区别,但是我已经根据需要最少“努力”评估的分支(而不是自然的数字顺序)对分支进行了排序。
Harpo的模式尽可能简单,但是[123]
是由多个分支机构满足的第一位数字匹配。
@MichaelHoffmann和@jonschlinkert的模式不正确,因为它们未能将必要的锚分配给每个分支。这是通过将所有分支包装在捕获组中来简单实现的,但就像@ninjalj,@ qwertymk和@amit_g演示了,将锚应用于每个分支同样准确。
let txt = '<table border=1 cellpadding=4><tr><th>Number</th><th>Harpo</th><th>Michael Hoffmann</th><th>ninjalj</th><th>jonschlinkert</th><th>qwertymk</th><th>amit_g</th><th>mickmackusa</th></tr>',
str,
i;
for (i = 0; i <= 40; ++i) {
str = '' + i;
txt += '<tr><td>' + i;
txt += '</td><td>' + /^([1-9]|[12]\d|3[0-6])$/.test(str);
txt += '</td><td>' + /^[0-9]|[0-2][0-9]|3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2][0-9]$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]|[1-2][0-9]|3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2]\d$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2]\d$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^(3[0-6]?|[12]\d?|[4-9])$/.test(str);
txt += '</td></tr>';
}
txt = txt + '</table>';
document.getElementById('test').innerHTML = txt;
<div id="facts">Correct Pattern Designers: Harpo, ninjalj, qwertymk, amit_g, mickmackussa<br>Incorrect Patterns: Michael Hoffmann, jonschlinkert <br></div>
<div id="test"></div>
答案 7 :(得分:0)
检查在控制台中运行这个试试这个:
var pat = /^[1-9]$|^[1-2]\d$|^3[0-6]$/;
for(var i = 0; i < 100; i++) {
if (pat.test(i)) {
document.write(i + "pass");
}
else{
document.write(i + "fail");}
document.write("<br/>");
}
(1 到 36 之间的所有数字)。