Ruby正则表达式匹配模式后跟另一个模式

时间:2015-04-13 07:53:05

标签: regex ruby-2.1

我已经有一个regex来匹配逗号分隔字符串中的单个数字。我需要更新它以匹配以下字符串:

 5|5,4,3
 2|1,2 , 3

约束是

  • 它应该以1-5的范围内的单个数字开头,然后是管道符(|)
  • 后跟管道字符的字符串 - 它应该是1-7范围内的单个数字,可选地后跟逗号。这种模式可以重复。对于例如在管道符号之后,以下字符串被认为是有效的:

    "6"
    
    "1,7"
    
    "1,2,3, 4,6"
    
    "1, 4,5,7"
    

但是,以下字符串被视为无效

    "8"

    "8, 9,10"

我尝试了以下(其他变体)

  \A[1-5]\|[1-7](?=(,|[1-7]))*

但它没有按预期工作。对于例如用于样本字符串

  5|5,4, 3, 10,5

它匹配

  5|5

我需要捕获管道字符前的数字和所有匹配的数字后跟管道字符。对于例如在以下示例字符串 5 | 5,4,3,2,1 中,正则表达式应该捕获

  1. 5
  2. [5,4,3,2,1]
  3. 注意:我使用的是Ruby 2.2.1

    另外,你介意让我知道我在我的正则表达式模式中犯了哪些错误,但是没有按预期工作吗?

    感谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试下面的正则表达式。

^([1-5])\|([1-7]\s*(?:,\s*[1-7])*)$

示例:

> "5|5,4, 3, 2, 1".scan(/^([1-5])\|([1-7]\s*(?:,\s*[1-7])*)$/)
=> [["5", "5,4, 3, 2, 1"]]

> "5|5,4, 3, 2, 1".scan(/([1-5])\|([1-7] ?(?:, ?[1-7])*)$/)
=> [["5", "5,4, 3, 2, 1"]]

答案 1 :(得分:1)

您可以尝试以下正则表达式匹配数字和管道后的一组逗号/空格分隔数字:

^[1-5]\|(?:(?:[1-7]\s*,\s*)+\s*[1-7]?|[1-7])\b

这是demo