Ruby 正则表达式匹配后跟另一个模式的模式
Ruby regex to match a pattern followed by another pattern
我已经有一个 可以只匹配逗号分隔字符串中的单个数字。我需要更新它以匹配如下字符串:
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 中,正则表达式应捕获
- 5
- [5、4、3、2、1]
注:我用的是Ruby2.2.1
另外,您介意让我知道我在正则表达式模式中犯了什么错误,导致它没有按预期工作吗?
谢谢。
您可以尝试使用以下正则表达式匹配管道后的数字和一组 comma/space 分隔的数字:
^[1-5]\|(?:(?:[1-7]\s*,\s*)+\s*[1-7]?|[1-7])\b
这里是demo.
您可以试试下面的正则表达式。
^([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"]]
我已经有一个
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 中,正则表达式应捕获
- 5
- [5、4、3、2、1]
注:我用的是Ruby2.2.1
另外,您介意让我知道我在正则表达式模式中犯了什么错误,导致它没有按预期工作吗?
谢谢。
您可以尝试使用以下正则表达式匹配管道后的数字和一组 comma/space 分隔的数字:
^[1-5]\|(?:(?:[1-7]\s*,\s*)+\s*[1-7]?|[1-7])\b
这里是demo.
您可以试试下面的正则表达式。
^([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"]]