我遇到一个问题,我将尝试通过代码来表示。我的正则表达式提取此字符串中的两个数字,将它们转换为双精度,然后将它们存储在数组中。正则表达式不起作用的情况是只有一位数字时。我在代码的注释中提供了存储在数组中的值的示例输出。
each_row = ["5.8 - 3.0%"] #works
each_row = ["5 - 71%"] #doesn't work
each_row = ["5.0 - 7%"] #doesn't work
each_row = ["5.0 - 71%"] #works
each_row.map do |row|
value_pair = row.scan(/\d+.?\d+ - \d+\.?\d+/).map do |token|
token.split(" - ").map(&:to_f)
end
puts value_pair[0][0] #5.8
puts value_pair[0][1] #3.0
end
您只需要使用可选的非捕获组
/\d+(?:\.\d+)?\s+-\s+\d+(?:\.\d+)?/
解释:
\d+
-一个或多个数字(?:\.\d+)?
-非捕获的可选组((?:...)?
),该组与点后跟一个或多个数字匹配\s+
-一个或多个空格符号使用scan
,您需要一个非捕获组,以便不提取该组捕获的值。
一些更多的想法
您必须\d+.?\d+
匹配1+个数字,后跟1或0个点,后跟1+个数字。两个加号需要2位数字。除了上面已经建议的选项之外,您还有什么选择?
如果您允许.05
使用类似的值\d*\.?\d+
,则可以使用0+位数后跟一个可选(1或0)点和1+位数来匹配。这不会将整数值与末尾带点的点匹配(例如54.
)。
要使结尾的浮点数或整数与一个点匹配,可以使用\d+\.?\d*
。
通过与+
,*
量词和可选组一起使用,您可以将建议的表达式调整为将来可能需要的任何条件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句