在Ruby中使用积极的先行

时间:2014-03-24 21:13:22

标签: ruby regex lookahead

我正在为以下短语变体编写正则表达式:

  • "购物车总额超过$ 5.00"
  • "购物车总额低于$ 5.00"
  • "购物车总数大于5.00" (注意数字中没有$ ...这就是“失败的”)

我抓住了两件事:"更大"或者"较少"和金额。我想知道是否有一个美元符号,但是这就是绊倒我。

这是我的正则表达式:

/^.*(?=cart total).*(?=(greater|less)).*(?=\$([0-9.]+))/

这:

"cart total is greater than $5.00".match(/^.*(?=cart total).*(?=(greater|less)).*(?=\$([0-9.]+))/)

让我更好"和5.00但是这个:

    "cart total is greater than 5.00".match(/^.*(?=cart total).*(?=(greater|less)).*(?=\$([0-9.]+))/)

让我"更大"和""

我意识到前瞻是专门搜索" $"在小组中,所以取出它导致它没有找到金额,但我喜欢看到如何修改这个以找到金额,无论是否存在" $"或不。

谢谢!

3 个答案:

答案 0 :(得分:5)

在这种情况下,对我来说前瞻是不必要的。我删除了那些。并为可选的美元符号添加\$?

^.*?cart total.*?(greater|less).*?\$?([0-9.]+)

答案 1 :(得分:3)

在这种情况下,前瞻不是必需的。我略微改善了您的美元匹配,以匹配数字中的逗号,例如$1,000.00,并且没有任何逗号/小数点,例如$10

regex = /cart total is (greater|less) than \$?((?:\d+,?)+(?:.\d+)?)/

strings = [
  "cart total is greater than 5.00",
  "cart total is less than $1,500,000.00",
  "cart total is greater than $5"
]

strings.each do |string|
  p string.match(regex)
end

#<MatchData "cart total is greater than 5.00" 1:"greater" 2:"5.00">
#<MatchData "cart total is less than $1,500,000.00" 1:"less" 2:"1,500,000.00">
#<MatchData "cart total is greater than $5" 1:"greater" 2:"5">

答案 2 :(得分:1)

您可以使用optional quantifier ? 对原始正则表达式的一个小修改 -

^.*(?=cart total).*(?=(greater|less)).*(?=\$?([0-9.]+))
                                            ^ Added ?

演示here