【发布时间】:2011-06-09 02:14:15
【问题描述】:
我很难用这个正则表达式匹配字符串“79¢ /lb”:(\$|¢)\d+(.\d{1,2})?
当分号出现在开头时效果很好,但我不知道需要在字符串末尾附近添加什么。
基本上我打算从这个价格标签中提取一个浮点值,即 0.79,提前谢谢,我正在使用 ruby。
【问题讨论】:
我很难用这个正则表达式匹配字符串“79¢ /lb”:(\$|¢)\d+(.\d{1,2})?
当分号出现在开头时效果很好,但我不知道需要在字符串末尾附近添加什么。
基本上我打算从这个价格标签中提取一个浮点值,即 0.79,提前谢谢,我正在使用 ruby。
【问题讨论】:
嗯,这个正则表达式要求 $ 或 ¢ 位于字符串的开头。要匹配 79¢ /lb,您需要类似:
(\d+)¢
¢ 出现在 数字之后。
单个正则表达式来匹配您可能会看到的多种不同格式会稍微复杂一些。我建议将其作为多个正则表达式进行(为简单起见),或者在此处提出另一个问题,指定您要从中获取价格的完整字符串范围。
【讨论】:
当您分别考虑每种情况时,最容易找出正确的正则表达式。如果我正确理解您的问题,有 4 种情况:
首先,为每种情况分别编写一个正则表达式:
¢(\d{1,2})\b\b(\d{1,2})¢\$(\d+(?:\.\d{2})?)\b\b(\d+(?:\.\d{2})?)\$然后,将它们组合成一个正则表达式:
regex = %r{
¢(\d{1,2})\b | # case 1
\b(\d{1,2})¢ | # case 2
\$(\d+(?:\.\d{2})?)\b | # case 3
\b(\d+(?:\.\d{2})?)\$ # case 4
}x
然后,随心所欲:
string_with_prices.scan(regex) do |match|
# If there was a match in the first two groups, it's for cents
cents = $1 || $2
# ...and the last two groups are dollars.
dollars = $3 || $4
if cents
puts "found price (cents): #{cents}"
elsif dollars
puts "found price (dollars): #{dollars}"
else
puts 'unknown match!'
end
end
注意:为了测试这段代码,我必须使用“c”而不是“¢”,因为 Ruby 告诉我invalid multibyte char (US-ASCII)。为避免此问题,请使用不同的字符编码,或者找出“¢”字符的编码值并将其直接嵌入到正则表达式中,例如%r{\x42} 而不是 %r{¢}。
【讨论】:
也许你不需要在你的 reg exp 中做所有事情;
#price is the string that contains the price
if price =~ /\$|¢/
value = string.match(/\d+/)
end
或者类似的东西。
【讨论】: