Ruby中的正则表达式的子串提取问题

时间:2017-03-09 03:36:39

标签: ruby regex

我试图通过使用正则表达式在Ruby中进行一些子字符串提取,并且遇到一些问题,正则表达式是过度选择性的#34;。

这是我尝试匹配的目标字符串:

"Exam­ple strin­g with 3 numbe­rs, 2 comma­s, and 6,388­ other­ value­s that are not inclu­ded."

我尝试提取的是提供的声明中的数值。为了说明逗号,我想出了/(\d{1,3}(,\d{1,3})*)/

这个表达式

在IRB中测试以下内容,这是代码和结果:

string = "Exam­ple strin­g with 3 numbe­rs, 2 comma­s, and 6,388­ other­ value­s that are not inclu­ded."
puts strin­g.scan(/(\­d{1,3}(,\d­{1,3})*)/)­
=> "[[\"3\", nil], [\"2\", nil], [\"6,388\", \",388\"]]"

我正在寻找的是["3", "2", "6,388"]的内容。以下是我需要帮助纠正的问题:

  • 为什么Ruby为每个不以逗号分隔的匹配组包含nil,以及如何调整正则表达式/匹配策略以删除它并得到一个" flat"阵列?
  • 如何阻止正则表达式匹配尝试匹配的子字符串的子表达式(即",388"中的"6,388")?
  • 我确实尝试使用.match(),但遇到的问题是它只返回"3"(可能是第一个匹配的值),没有其他信息明显。尝试使用[1][2]对其进行索引会导致nil

1 个答案:

答案 0 :(得分:1)

如果模式中有捕获组,String#scan将返回数组数组以表示所有组。

  

对于每个匹配,生成结果并将其添加到结果中   数组或传递给块。如果模式不包含任何组   单个结果由匹配的字符串$&组成。 如果是模式   包含组,每个单独的结果本身就是一个包含的数组   每组一个条目

通过删除捕获组或将(...)替换为非捕获组(?:...),您将获得不同的结果:

string = "Example string with 3 numbers, 2 commas, and 6,388 other values ..."
string.scan(/\d{1,3}(?:,\d{1,3})*/)   # no capturing group
# => ["3", "2", "6,388"]