2011-06-09 82 views
0

我遇到了難以匹配字符串「79¢/ lb」與這個正則表達式:(\ $ |¢)\ d +(。\ d {1,2})?紅寶石正則表達式匹配分¢

當分號出現在開頭時它工作正常,但我不知道需要在字符串末尾添加什麼。

基本上我打算從這個價格標籤提取一個浮點值,即0.79,在此先感謝,我使用的是紅寶石。

回答

1

那麼,該正則表達式要求$¢在字符串的開始。爲了匹配79¢ /lb,你需要這樣的:

(\d+)¢ 

其中¢數字。

一個單一的正則表達式可以與你可能看到的多種格式相匹配,但會更復雜一些。我建議或者將其作爲多個正則表達式(爲了簡單起見),或者在這裏提出另一個問題,指定要從中捕獲價格的全部字符串。

+0

謝謝paxdiablo。實際上,我希望正則表達式匹配諸如「$ 3.50公斤」或「¢69/100g」等字符串。我只是在尋找數值或者$或¢,無論它們出現在數值的開始還是結尾,忽略周圍的文字。 – 2011-06-09 02:39:06

0

也許你不需要在你的reg exp中做所有事情;

#price is the string that contains the price 
if price =~ /\$|¢/ 
    value = string.match(/\d+/) 
end 

或沿着這些線。

1

當分別考慮每個案例時,找出正確的正則表達式是最容易的。如果我沒有理解你的問題,有4例:

  1. 美分,與¢符號前的價格
  2. 美分,與¢符號後的價格
  3. 美元(和可選美分),與之前售價$符號
  4. 美元(和可選美分)的價格

後先$符號,分別寫出每種情況下,正則表達式:

  1. ¢(\d{1,2})\b
  2. \b(\d{1,2})¢
  3. \$(\d+(?:\.\d{2})?)\b
  4. \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{¢}