【问题标题】:Regex to match 2-10, but not 99正则表达式匹配 2-10,但不匹配 99
【发布时间】:2009-02-09 16:19:09
【问题描述】:

我在表单上有一个字段,它采用以下值:-1、2-10、99

我有一条与答案 2-10 相关的业务规则。

我正在尝试编写一个匹配 2-10 但 99的正则表达式,我遇到了麻烦。

原话:

^2|3|4|5|6|7|8|9|10$

失败,因为 99 匹配(技术上,两次)。此外,Line 边界是我从未感到舒服的东西。我在 expresso 中观察到的行为与在其他地方(例如 .net)不同。在这个特定的实例中,正则表达式在 javascript 中运行。无论如何,expresso 似乎忽略了它们(如果我将值放在括号中:

^[2|3|4|5|6|7|8|9|10]$

^[2-9]$

“全部拼写”或作为一个范围,如果我指定开始行/字符串结束行/字符串字符,expresso 永远不会返回任何匹配项(是的,我试图在第二种情况下单独匹配 10 个) .

我知道,我知道。如果您使用正则表达式来解决问题,那么您将遇到两个问题(并且大概他们会开始邀请朋友过来,事物 1 和事物 2 风格)。我没有必须在这里使用一个;我可能会切换到案例陈述。但似乎我应该可以在这里使用正则表达式,这似乎是一件合理的事情。当谈到正则表达式时,我仍然很年轻;

【问题讨论】:

    标签: javascript regex numeric-ranges


    【解决方案1】:

    这显然是你不应该使用 RegExp 而使用数值计算的情况:

    var num = parseInt(aNumber, 10);
    if (num >= 2 && num <= 10) {
        alert("Match found!");
    }
    

    【讨论】:

    • parseInt(aNumber,10) // 不要忘记基数,否则你会感到惊讶。
    • 打得很好,先生。打得很好。
    • 虽然我同意在大多数情况下这将是比正则表达式更好的解决方案,但更好的解决方案是通过 UI 限制输入(下拉列表有人吗?)。但是,这个问题专门针对正则表达式。
    • 仅仅因为问题是关于正则表达式的并不意味着正确的答案是格式正确的正则表达式。 weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/…
    • @ Kris - 下拉菜单不会阻止人们向服务器提交任何值。 @ gs - 实际上,由于这是正在解析的用户输入,我认为这里需要基数。你永远不知道他们会输入什么。
    【解决方案2】:

    你需要括号。我会进一步使用范围来保持可读性:

    ^([2-9]|10)$
    

    【讨论】:

    • "^" 和 "$" 都应替换为 "\b"。含义相同,但您可以将其全局应用于完整的字符串。
    【解决方案3】:

    在交替周围使用括号,因为连接的优先级高于交替:

    ^(2|3|4|5|6|7|8|9|10)$
    

    【讨论】:

    • 或者更紧凑的形式 ^([2-9]|10)$
    • 那么为什么这与 Expresso 中的任何内容都不匹配?我在示例文本窗口中大量插入了数值,但没有匹配项?一定有一些设置我需要调整,但 Expresso 把我甩到了这里。
    • @Martin - 你错过了一个技巧,看到 soulmerges 的回答:)
    • @peacedog - 您发布的代码有 [ 不是 (,这完全改变了含义
    • @annakata - 我明白了,但我说的是亚当的回答。它对我来说在 Expresso 中不起作用。
    【解决方案4】:

    一个完整的 javascript 函数来匹配 2 到 9 或 10

    <script type="text/javascript">
        function validateValue( theValue )
        {
            if( theValue.match( /^([2-9]{1}|10)$/ ) )
            {
                window.alert( 'Valid' );
            }
            else
            {
                window.alert( 'invalid' );
            }
            return false;
        }
    </script>
    

    正则表达式很容易扩展以包含您的所有规则:

    /^(-1|[2-9]|10|99)$/ // will match -1, 2-10, 99
    

    编辑:我忘了提到你必须替换你自己的真/假情境逻辑。 edit2:在第二个正则表达式中添加了缺少的括号。

    【讨论】:

    • 错了。 /^-1|[2-9]|10|99$/ 将匹配字符串开头的 -1,或任意位置的 2,3,4,5,6,7,8,9,或任意位置的 10 , 或字符串末尾的 99。也许你的意思是: /^(-1|[2-9]|10|99)$/ (你的第一个正则表达式也是错误的)
    • 我刚刚发现我的测试用例不够广泛,这让你在这两个方面都正确。我已经适应了 sn-p。
    【解决方案5】:

    您的原始表达式失败的原因是因为您正在匹配 ^2, 3, 4, 5, 6, 7, 8, 9, 10$。

    试试这个正则表达式:^(2|3|4|5|6|7|8|9|10)$

    【讨论】:

      【解决方案6】:

      这个在线实用程序非常擅长为数字范围生成 re:http://utilitymill.com/utility/Regex_For_Range。对于 2-10(含)范围,它给出以下表达式:\b0*([2-9]|10)\b。如果要省略前导 0,请去掉“0*”部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        相关资源
        最近更新 更多