gpt4 book ai didi

ruby - Ruby 中正则表达式的子字符串提取问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:32 25 4
gpt4 key购买 nike

我试图通过使用正则表达式在 Ruby 中进行一些子字符串提取,但遇到了一些正则表达式“过度选择性”的问题。

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

“包含 3 个数字、2 个逗号和 6,388 个未包含的其他值的示例字符串。”

我试图提取的是提供的语句中的数值。为了解释逗号,我想到了表达式 /(\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,我如何调整正则表达式/匹配策略以删除它并获得“平面”数组?<
  • 如何防止正则表达式匹配我尝试匹配的子字符串的子表达式(即 "6,388" 中的 ",388" >)?
  • 我确实尝试使用 .match(),但遇到了一个问题,它只是返回了 "3"(大概是第一个匹配的值),没有其他信息一目了然。尝试使用 [1][2] 对其进行索引会导致 nil

最佳答案

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

For each match, a result is generated and either added to the result array or passed to the block. If the pattern contains no groups, each individual result consists of the matched string, $&. If the pattern contains groups, each individual result is itself an array containing one entry per group.

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

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"]

关于ruby - Ruby 中正则表达式的子字符串提取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com