我遇到了難以匹配字符串「79¢/ lb」與這個正則表達式:(\ $ |¢)\ d +(。\ d {1,2})?紅寶石正則表達式匹配分¢
當分號出現在開頭時它工作正常,但我不知道需要在字符串末尾添加什麼。
基本上我打算從這個價格標籤提取一個浮點值,即0.79,在此先感謝,我使用的是紅寶石。
我遇到了難以匹配字符串「79¢/ lb」與這個正則表達式:(\ $ |¢)\ d +(。\ d {1,2})?紅寶石正則表達式匹配分¢
當分號出現在開頭時它工作正常,但我不知道需要在字符串末尾添加什麼。
基本上我打算從這個價格標籤提取一個浮點值,即0.79,在此先感謝,我使用的是紅寶石。
那麼,該正則表達式要求$
或¢
在字符串的開始。爲了匹配79¢ /lb
,你需要這樣的:
(\d+)¢
其中¢
來後數字。
一個單一的正則表達式可以與你可能看到的多種格式相匹配,但會更復雜一些。我建議或者將其作爲多個正則表達式(爲了簡單起見),或者在這裏提出另一個問題,指定要從中捕獲價格的全部字符串。
也許你不需要在你的reg exp中做所有事情;
#price is the string that contains the price
if price =~ /\$|¢/
value = string.match(/\d+/)
end
或沿着這些線。
當分別考慮每個案例時,找出正確的正則表達式是最容易的。如果我沒有理解你的問題,有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{¢}
。
謝謝paxdiablo。實際上,我希望正則表達式匹配諸如「$ 3.50公斤」或「¢69/100g」等字符串。我只是在尋找數值或者$或¢,無論它們出現在數值的開始還是結尾,忽略周圍的文字。 – 2011-06-09 02:39:06