Javascript RegExp数字范围(1到36)

Javascript RegExp数字范围(1到36),javascript,regex,Javascript,Regex,我搜索了很多,找不到这个RegExp的解决方案(我不得不说我对Reg.Expressions不是很有经验) 我想测试一个介于1和36之间的数字,不包括0和37及以上 到目前为止,我所得到的几乎是有效的(它不接受17、18、19、27、28、29) 有人能帮我吗?试试这个: ^[1-9]$|^[1-2][0-9]$|^3[0-6]$ /^[1-9]$|^[1-2]\d$|^3[0-6]$/ (所有1位数介于1和9之间,所有1位数和2位数,以及3位数介于30和36之间)。尝试以下方法: ^[1-

我搜索了很多,找不到这个RegExp的解决方案(我不得不说我对Reg.Expressions不是很有经验)

我想测试一个介于1和36之间的数字,不包括0和37及以上

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

有人能帮我吗?

试试这个:

^[1-9]$|^[1-2][0-9]$|^3[0-6]$
/^[1-9]$|^[1-2]\d$|^3[0-6]$/
(所有1位数介于1和9之间,所有1位数和2位数,以及3位数介于30和36之间)。

尝试以下方法:

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

试试
^[1-9]$^[1-2]\d$^3[0-6]$
你知道
\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/>");
    }
}
功能测试(){
对于(变量i=0;i<100;i++){
如果(/^([1-9]|[12]\d | 3[0-6])$/.test(i.toString())!=(i>=1&&i
^(?[1-9]|[1-2][0-9]| 3[0-6])$

下面是它的分类:

^
=行首

(?:
标记非捕获组-一种指定操作顺序的方法,无需保存匹配的内容供以后使用

[1-9]
=1-9之间的任意数字

|
=或

[1-2][0-9]
='1'或'2',后跟0-9之间的任何数字

|
=或

3[0-6]
=“3”,后跟0-6之间的任意数字

$
=行尾

正如@mu太短所说,使用整数比较将更容易、更有效。下面是一个示例函数:

function IsInRange(number)
{
    return number > 0 && number < 37;
}
函数IsInRange(数字)
{
返回编号>0&&number<37;
}

我不知道为什么所有的答案都会重复在每个条件前后添加边界(
^
$
)的错误。但您只需要执行以下操作:

^([1-9]|[1-2][0-9]|3[0-6])$

我还创建了一个JavaScript/Node.js库,以简化创建这样的范围。

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

/^(3[0-6]?|[12]\d?|[4-9])$/
模式中有三个分支:

  • 第一场比赛:3,30,31,32,33,34,35,36
  • 第二场比赛:1,2,10-19,20-29
  • 第三场比赛:4,5,6,7,8,9
  • 如果在我的模式中有一个效率优势(而不是这个任务可能是一个主要的资源消耗——除非您正在进行数千次这样的评估),那么它将归结为模式中没有冗余检查这一事实

    /^(3[0-6]?|[12]\d?|[4-9])$/
    
    这可能不会对正则表达式引擎产生任何影响,但我已经根据最不需要“努力”评估的分支(而不是自然的数字序列)来排序我的分支

    Harpo的模式尽可能简短,但是
    [123]
    是多个分支满足的第一个数字匹配

    @Michaelhofmann和@jonschlinkert的模式不正确,因为它们没有将必要的锚分布到每个分支。这可以通过将所有分支包装在一个捕获组中简洁地实现,但正如@ninjalj、@qwertymk和@amit_g所展示的,将锚应用到每个分支同样准确

    let txt='NumberHarpoMichael hoffmanninjaljjonschlinkertqwertymkamit_gmickmackusa',
    str,
    我
    
    对于(i=0;我需要解释一下,我真的需要它是一个regexp,否则我会用普通的老javascript解决它:)此解决方案不正确地匹配了所有数字,如@mickmackusa的答案所示和解释。@FWDekker谢谢,我相信我现在已经解决了。需要括号。@jonschlinkert请阅读我的答案以了解您的模式不正确的原因。@Michaelhofmann请阅读我的答案以了解您的模式不正确的原因。
    pass
    适用于所有值。此解决方案不正确地匹配37、38、39、40,如@mickmackusa的回答中所示和解释。缺少括号。已修复。FWIW您的评论导致4次否决票。感谢您的修复。我不确定“重复在每个条件之前和之后添加边界的错误”是什么意思在你的答案中。这不正是你改正之前答案中遗漏的吗?