【问题标题】:tweak regex to accept several of the pattern调整正则表达式以接受几种模式
【发布时间】:2011-11-22 03:02:10
【问题描述】:

我验证我的输入是否通过了上面的两个正则表达式。 如何调整两个正则表达式,使其接受一个列表,即(如在 input2 和 input3 上)。现在我的正则表达式只适用于 input1。

2 或更高:

^\d{2}\d*$

非 0:

^[1-9]\d*$

input1: 123
input2: 123, 456
input3: 123, 456, 789

【问题讨论】:

    标签: regex


    【解决方案1】:

    首先,您发布的模式等同于^\d{2,}$,它要求数字有两个或多个数字。大于或等于 2 的整数的正则表达式更像 ^[+-]?0*([2-9]|[1-9]\d+)$。根据您的描述,不清楚您想要的是哪一个。

    无论哪种方式,你想要使用的是这样的:

    ^(<pattern>(,\s|$))+$`
    

    所以对于你的场景,它会是这样的:

    ^(\d{2,}(,\s|$))+$                #2 or more digits
    ^(0*([2-9]|[1-9]\d+)(,\s|$))+$    #positive integers >= 2
    ^(0*[1-9]\d*)(,\s|$))+$           #positive integers > 0
    

    我不确定您使用的是什么风格的正则表达式,但如果您的引擎拒绝在上述模式中重复使用 $,您可以尝试类似

    ^(<pattern>,\s)*<pattern>$
    

    相反。示例:

    ^(\d{2,},\s)*\d{,2}$    #2 or more digits, simplified
    

    请记住,执行此操作的更好方法通常是在逗号 + 空格分隔符上拆分字符串,这将为您提供一个字符串数组,您可以尝试将其解析为整数。

    【讨论】:

      【解决方案2】:

      首先,这是我为您的基本正则表达式推荐的内容:

      两位或多位数字:

      \d{2,}
      

      一位或多位数字:

      \d+
      

      现在,如果您希望它们中的任何一个匹配逗号和空格分隔的列表,您可以使用:

      (?:\d{2,}(?:\s*,\s*)?)+
      

      (?:\d+(?:\s*,\s*)?)+
      

      分别

      【讨论】:

      • 这也遇到了我在马克的回答下面描述的灾难性回溯问题。如果分隔符是完全可选的,那么捕获开始和结束的位置就很模糊。
      【解决方案3】:

      试试这个:

      ^[1-9]\d*(?:\s*,\s*[1-9]\d*)*$
      

      [1-9]\d* 匹配一个或多个数字,其中第一个不能为零。如果第一个数字之后还有更多字符,它们必须包含一个逗号,可选地被空格包围——\s*,\s*——后跟另一个数字。并且根据需要重复多次。

      如果您愿意,您可以对格式更加严格。例如,如果逗号必须紧跟在数字后面,并且逗号后面必须正好有一个空格,则可以使用:

      ^[1-9]\d*(?:, [1-9]\d*)*$
      

      【讨论】:

      • 为了验证,您可以将第一个* 转换为+,这样字符串就不能以逗号开头。不过,这会使空列表无法匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多