我试图通过使用正则表达式在Ruby中进行一些子字符串提取,并且遇到一些问题,正则表达式是过度选择性的#34;。
这是我尝试匹配的目标字符串:
"Example string with 3 numbers, 2 commas, and 6,388 other values that are not included."
我尝试提取的是提供的声明中的数值。为了说明逗号,我想出了/(\d{1,3}(,\d{1,3})*)/
。
在IRB中测试以下内容,这是代码和结果:
string = "Example string with 3 numbers, 2 commas, and 6,388 other values that are not included."
puts string.scan(/(\d{1,3}(,\d{1,3})*)/)
=> "[[\"3\", nil], [\"2\", nil], [\"6,388\", \",388\"]]"
我正在寻找的是["3", "2", "6,388"]
的内容。以下是我需要帮助纠正的问题:
nil
,以及如何调整正则表达式/匹配策略以删除它并得到一个" flat"阵列?",388"
中的"6,388"
)?.match()
,但遇到的问题是它只返回"3"
(可能是第一个匹配的值),没有其他信息明显。尝试使用[1]
或[2]
对其进行索引会导致nil
。答案 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"]