【问题标题】:Get price value from a string从字符串中获取价格值
【发布时间】:2012-01-16 11:56:44
【问题描述】:

我有一个字符串,其中价格值($544.50)可以是字符串中的任何位置。 例如:HP G60-630US 笔记本电脑:笔记本电脑 | RadioShack.com --> 259.97 美元(radioshack.com)

我需要从字符串中取出值:259.97

为此,我尝试使用一些随机正则表达式。 但没有运气!

谁能帮助我,提供一个正确的正则表达式字符串,以便从字符串中检索此价格值。

提前致谢。

【问题讨论】:

  • 总是以美元 ($) 为单位吗?
  • 简单正则表达式:\$\d+(\.\d{1,2})?
  • \$\d+(\.\d{1,2})?这行得通!关于雅虎管道的任何想法。匹配号码后,我们只需要得到那个号码。为此,我们需要在 value 字段中给出一个值。有什么想法吗?

标签: regex string currency yahoo-pipes


【解决方案1】:

此正则表达式适用于多种货币:$ £ €

[\$\£\€](\d+(?:\.\d{1,2})?)

Example

【讨论】:

  • [\$\£\€](\d+(?:\.\d{1,2})?) 它的工作原理!又一个蹩脚的问题。在 Yahoo 管道中,使用 regex 模块,匹配后我们需要在 value 字段中给出一个值。所以我只能从完整的字符串中得到数字。你能帮忙吗?
  • 数字在正则表达式的第一个匹配中。通常 match[0] 是完整的字符串,而 match[1] 是您要查找的数字。我不知道雅虎管道。但是你能选择你想要使用的匹配吗?
【解决方案2】:

[$]?[0-9]*(\.)?[0-9]?[0-9]?

这应该匹配那些带有$ 符号和那些没有。

【讨论】:

  • 在型号中也能找到“60”和“630”。
【解决方案3】:

这样的事情可能会起作用:

/\$(\d*\.?\d+?)/

【讨论】:

    【解决方案4】:

    \$(\d*\.?\d*) 应该可以工作,不是最佳但可能有用。

    (重要:转义$和.,它们是特殊字符)

    【讨论】:

    • 这也将匹配这样的内容:$300 rfersijfurhfurnfuerfnurjfrifnrunfurfrfurhufrhfhr 4594545
    • @micha:我忘了转义.,是的。但即使没有,我也看不出你的字符串会如何匹配? d 匹配一个数字,.任何东西(但最多一次)。我使用 * 而不是 + 来考虑 $.50 等价格
    【解决方案5】:

    这会在字符串中找到第一个十进制数:

    ^[^\d]*(\d+|\d+((,|\.)\d{1,2}))(\s|[a-zA-Z)]|€|$).*
    
    • 仅查找带 0-2 位小数的小数点或允许使用逗号的数字
    • 数字前后不需要空格
    • 数字不得以任何分隔符结尾(例如,不返回 12.12. 或 12!)
    • 号码可以以欧元符号€结尾
    • 适用于美国负数 ($1233.50)

    【讨论】:

    • 当我在给定的无线电小屋字符串上进行测试时,它没有找到匹配项。
    • 它应该适用于正数,例如。 1233.50 美元。现在已经更新了正则表达式以接受负数:($1233.50)
    【解决方案6】:

    这里有一种替换和提取的方法

    摘录:

    preg_match('/\$([0-9]+[\.]*[0-9]*)/',$string,$matches);
    foreach($matches as $match) {
      echo $match."<br>";
    }
    //echo $matches[0]; for just the first match
    

    修改/替换:

    $string = preg_replace_callback('/\$([0-9]+[\.]*[0-9]*)/', function ($matches) {
    
    
                foreach ($matches as $match) {
                    // only if value is !empty and higher than 0
                    $tmp = str_replace("$", "", $match);
                    if ($tmp > 0 && $tmp != "") {
                        //do something to $tmp in this case round to two decimal places
                        return "$" . round($tmp,2);
    
                    }
    
                }
    
            }, $string);
    

    在我的替换示例中处理符号可能有更好的方法。

    【讨论】:

      【解决方案7】:

      正则表达式过滤掉数字: 字符串正则表达式 = ([0-9]+[, .]?)+ 你可以这样使用它:

      货币符号 + 正则表达式 正则表达式 + CurrencySymbol

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-08
        • 2021-07-17
        • 1970-01-01
        • 2015-11-15
        • 2017-08-26
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多