【问题标题】:Regex for finding first occurrence of price用于查找第一次出现价格的正则表达式
【发布时间】:2017-04-21 20:02:55
【问题描述】:

我只需要从下面的字符串中提取94.00

我会使用哪个正则表达式来做到这一点?我当前的[^$]+$ 正则表达式正在返回$99.00 (176)

5 Easy Payments $94.00 $99.00 (176)

【问题讨论】:

  • \$[\d.]+ .....
  • 用什么语言?一些匹配方法只返回第一次出现,一些返回全部。
  • 请告诉我们在哪里以及您是如何使用正则表达式的。
  • 在 C# 中,我使用 Regex.Match(s, @"\d*\.?\d+").Value,在 Python 中,re.search(r'\d*\.?\d+', s).group()
  • 抱歉耽搁了。它使用 .net 版本的正则表达式。

标签: regex


【解决方案1】:

看来您可能想要使用这个正则表达式:

\$[\d.]+

这匹配所有价格,因此根据您的语言,只需使用该函数来获取第一次出现的价格。但是,这也将匹配像 $...... 这样荒谬的东西作为价格。

\$[\d]+\.[\d]+ 只会匹配$123.456 格式的价格,其中包含任意位数。

^[^$]+\$[\d]+\.[\d]+ 将匹配价格中最后一位数字的所有内容。这在当前状态下是无用的,因为它会为您的测试字符串返回 5 Easy Payments $94.00

^[^$]+(\$[\d]+\.[\d]+) 将匹配与上述相同的内容,但正则表达式的第 1 组将是价格 $94.00。如果您只想匹配数字本身,请将左括号移至^[^$]+\$([\d]+\.[\d]+)

问题是,如果在第一个有效价格之前的某处有非价格美元符号,这将不返回任何匹配项。只要这不是问题,^[^\$]+\$([\d]+\.[\d]+) 将为您提供捕获组 1 的94.00

【讨论】:

    【解决方案2】:

    如果您无法使用任何正常的编程方法来控制您获得的匹配数量,则需要使用捕获机制:

    /(\$\d+(?:\.\d+)?)[\s\S]*/
    

    这个正则表达式找到第一个(因为任何正则表达式引擎都从左到右处理字符串,至少默认情况下)$+1 or more digits+an optional sequence of '.' and 1 or more digits捕获这个文本到组1(使用(\$\d+(?:\.\d+)?)),然后匹配并且消耗整个字符串的其余部分使用[\s\S]*(任何0个或更多字符)。

    Your value is in Group 1:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2017-07-29
      • 1970-01-01
      • 2016-03-18
      • 2022-08-13
      • 1970-01-01
      相关资源
      最近更新 更多