【问题标题】:Ruby regex to match a pattern followed by another patternRuby正则表达式匹配一个模式后跟另一个模式
【发布时间】:2015-06-18 11:19:47
【问题描述】:

我已经有一个 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]

注意:我使用的是 Ruby 2.2.1

你介意让我知道我在正则表达式模式中犯了什么错误,导致它没有按预期工作吗?

谢谢。

【问题讨论】:

  • /^[1-5]\|[1-7](\s*,\s*[1-7])*/,也许?
  • 你的意思是^([1-5])\|\s*([1-7]\s*(?:,\s*[1-7]\s*)*)$ ?

标签: regex ruby-2.1


【解决方案1】:

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

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

这是demo

【讨论】:

  • 这将匹配 2| 并且因为您将 \s 放在字符类中!
  • @stribizhev 在管道后添加一个空格。
  • 我已经修复了正则表达式,现在它应该可以正常工作了。
  • 这个匹配:^[1-5]\|(?:(?:[1-7]\s*,\s*)+\s*[1-7]?|[1-7])$
  • 不匹配 2|3,3 , ;) 和 2,2,2
【解决方案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"]]

【讨论】:

  • op 是否要处理单个空格?然后这个^([1-5])\|([1-7] ?(?:, ?[1-7])*)\b$
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多