Ruby 从字符串中捕获总金额的正则表达式是什么?

Ruby 从字符串中捕获总金额的正则表达式是什么?,ruby,regex,Ruby,Regex,我需要解析来自不同文件的总金额。每个文件的布局都不同,因此需要解析的行也不同 从一个刺中捕获一个在“Total”之后的数字的正则表达式应该是什么 需要区分大小写,并在“合计”后考虑最接近的匹配。“Total”之前或之后可以有任何内容,我需要它后面的第一个数字 例如: from string "Service charges: 10 Total: 100 Shipping: 10" from string "Service charges: 10 Total Amount: 100 Shippin

我需要解析来自不同文件的总金额。每个文件的布局都不同,因此需要解析的行也不同

从一个刺中捕获一个在“Total”之后的数字的正则表达式应该是什么

需要区分大小写,并在“合计”后考虑最接近的匹配。“Total”之前或之后可以有任何内容,我需要它后面的第一个数字

例如:

from string "Service charges: 10 Total: 100 Shipping: 10"
from string "Service charges: 10 Total Amount: 100 Shipping: 10"
from string "Service charges: 10 Grand Total: 100 Shipping: 10"
from string "Service charges: 10 Total Amount (Rs.): 100 Shipping: 10"

在上述所有情况下,输出应为
100

我认为您可以这样做:

/Total[^:]*:\s+([0-9]+)/i
说明:

  • Total
    搜索“Total”
  • [^:::]*
    后跟任何内容或任何内容,直到找到冒号“:”
  • :\s+
    读取冒号和下面的任何空格(可以用*代替+)
  • ([0-9]+)
    将数字读入一组,以便以后检索->100
我不确定如何在您使用的环境中指示大小写不敏感,但通常可以使用一些标志来完成,如我用
I

这里有一个

#假设您的所有文件都已准备就绪
a=[“服务费:10总计:100运费:10”,“服务费:10总计:100运费:10”,“服务费:10总计:100运费:10”,“服务费:10总计:100运费:10”]
#我们用下面的regexp找到每个总数
a、 映射{s|s[/total[^\d]*(?\d+)/i,“total']}
#=> ["100", "100", "100", "100"]

regexp是
/total[^\d]*(?\d*)/i
。它查找单词“total”并忽略后面的任何字符,直到找到一个数字(在捕获组中返回)。
i
选项使其不区分大小写。

如果您真正想要的是各种字符串的模式匹配,请查看使用
scan
并获取数字字符串:

[
  "Service charges: 10 Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount: 100 Shipping: 10",
  "Service charges: 10 Grand Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount (Rs.): 100 Shipping: 10",
].map{ |s| s.scan(/\d+/)[1] }
=> ["100", "100", "100", "100"]
这假设您希望每个字符串中包含第二个数字

如果该订单将要更改,这是不可能的,因为看起来您正在扫描发票,那么模式和/或
scan
的变化将起作用。这将对其进行切换,并使用基于“Total”位置的标准正则表达式搜索,一些可能的中间文本,后跟“:”和总值:

[
  "Service charges: 10 Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount: 100 Shipping: 10",
  "Service charges: 10 Grand Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount (Rs.): 100 Shipping: 10",
].map{ |s| s[/Total.*?: (\d+)/, 1] }
=> ["100", "100", "100", "100"]
要获取整数值,请在
map
语句内将
附加到\u i

[
  "Service charges: 10 Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount: 100 Shipping: 10",
  "Service charges: 10 Grand Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount (Rs.): 100 Shipping: 10",
].map{ |s| s[/Total.*?: (\d+)/, 1].to_i }
=> [100, 100, 100, 100]

对于示例字符串,最好使用区分大小写的模式来匹配“Total”,除非您知道将遇到小写的“Total”。在这种情况下,你应该给出这样一个例子。

这是非常不清楚的。举一个例子,说明你所拥有的和你所期望的。当你已经在使用Nokogiri时,为什么你想要一个正则表达式?@squiguy,因为它不是一个格式正确的html,我可以使用css或xpath选择器。使用文本匹配会更简单。@luksch抱歉没有这么清楚。添加了示例。没问题。现在没事了,我给了你一个可能对你有用的答案。Nokogiri不理解,也不关心正则表达式。它只涉及解析XML或HTML,以及使用CSS或XPath表达式定位节点。我的答案是关于正则表达式,而不是关于html解析。但为了更好地反映这一点,我改变了答案。
[
  "Service charges: 10 Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount: 100 Shipping: 10",
  "Service charges: 10 Grand Total: 100 Shipping: 10",
  "Service charges: 10 Total Amount (Rs.): 100 Shipping: 10",
].map{ |s| s[/Total.*?: (\d+)/, 1].to_i }
=> [100, 100, 100, 100]