RegEx数量范围(1到36)

时间:2011-04-27 22:44:17

标签: javascript regex

我搜索了很多,找不到这个RegExp的解决方案(我不得不说我在Reg。表达方面不是很有经验)。

我想测试1到36之间的数字,不包括0和37及以上。

到目前为止我所得到的几乎是有效的(它不接受17,18,19,27,28,29)......

^[1-9]{1}$|^[1-3]{1}[0-6]{1}$|^36$;

有人能帮助我吗?

8 个答案:

答案 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)

试试这个:

/^[1-9]$|^[1-2]\d$|^3[0-6]$/

DEMO

答案 5 :(得分:1)

尝试^[1-9]$|^[1-2]\d$|^3[0-6]$

答案 6 :(得分:0)

纯粹出于学术原因,我将添加一个独特且准确的模式。

/^(3[0-6]?|[12]\d?|[4-9])$/

模式中有三个分支:

  1. 首场比赛:3、30、31、32、33、34、35、36
  2. 第二场比赛:1、2、10-19、20-29
  3. 第三场比赛:4,5,6,7,8,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 之间的所有数字)。