【问题标题】:ruby regex matching cent ¢ruby 正则表达式匹配 cent ¢
【发布时间】:2011-06-09 02:14:15
【问题描述】:

我很难用这个正则表达式匹配字符串“79¢ /lb”:(\$|¢)\d+(.\d{1,2})?

当分号出现在开头时效果很好,但我不知道需要在字符串末尾附近添加什么。

基本上我打算从这个价格标签中提取一个浮点值,即 0.79,提前谢谢,我正在使用 ruby​​。

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    嗯,这个正则表达式要求 $¢ 位于字符串的开头。要匹配 79¢ /lb,您需要类似:

    (\d+)¢
    

    ¢ 出现在 数字之后。

    单个正则表达式来匹配您可能会看到的多种不同格式会稍微复杂一些。我建议将其作为多个正则表达式进行(为简单起见),或者在此处提出另一个问题,指定您要从中获取价格的完整字符串范围。

    【讨论】:

    • 感谢 paxdiablo。实际上,我希望正则表达式匹配“$3.50 kg”或“¢69 /100g”等字符串。我只是在寻找伴随 $ 或 ¢ 的数值,无论它们出现在数值的开头还是结尾, 忽略周围的文字。
    【解决方案2】:

    当您分别考虑每种情况时,最容易找出正确的正则表达式。如果我正确理解您的问题,有 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{¢}

    【讨论】:

      【解决方案3】:

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

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

      或者类似的东西。

      【讨论】: