【问题标题】:Perl Regex (\d*\.\d{2})Perl 正则表达式 (\d*\.\d{2})
【发布时间】:2012-01-16 22:19:17
【问题描述】:

我在 Perl 中遇到了一个似乎给我带来问题的正则表达式。我对 Perl 还很陌生——但我认为这不是我的问题。

代码如下:

if ($line =~ m/<amount>(\d*\.\d{2})<\//) { $amount = $1; }

我实际上是在为单个标签解析 XML 格式的文件。这是我要解析的具体值。

<amount>23.00000</amount>

有人能解释一下为什么我的正则表达式不起作用吗?

编辑:我应该提到我正在尝试将金额作为货币价值导入。后面的 3 位小数没有用。

【问题讨论】:

  • 你只匹配两个小数位,你的文本中有 5 个
  • 你的正则表达式中真的有反引号字符吗?
  • 抱歉,实际的正则表达式中没有反引号。由于某种原因,该网站在我的“代码”中忽略了 ,所以我将它们放入。
  • @Rico 这是因为您使用的是块引用而不是代码示例。

标签: regex perl


【解决方案1】:

You shouldn't use regex for parsing HTML,但无论如何这都会解决它:

if ($line =~ m|<amount>(\d*\.\d{2})\d*<//)| { $amount = $1; }

【讨论】:

    【解决方案2】:

    \d*\.\d{2} 正则表达式片段只能识别恰好有两位小数的数字。您的样本有五位小数,因此与该片段不匹配。

    如果您需要至少一位小数,您想使用 \d*\.\d+,如果您可以有 2 到 5 位小数,您想使用 \d*\.\d{2,5}

    而且你不应该在你的正则表达式中使用反引号字符,因为它们在正则表达式中没有意义,因此被解释为常规字符。

    所以你想使用:

    if ($line =~ m/<amount>(\d*\.\d{2,5})<\/amount>/) { $amount = $1; }
    

    【讨论】:

      【解决方案3】:

      在正则表达式模式中,序列“{2}”表示完全匹配前面模式的两个实例。

      所以 \d{2} 将只匹配两位数,而您的输入文本当时有五位数字。

      如果您不想要尾随数字,则可以在捕获括号外使用 \d* 丢弃它们。

      另外,如果您的模式包含斜杠,请考虑使用不同的分隔符以避免必须转义斜杠,例如

      if ($line =~ m{<amount>(\d*\.\d{2})\d*</}) { $amount = $1; }
      

      另外,如果您想解析 XML,那么您可能需要考虑使用 XML 库,例如 XML::LibXML

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 2017-07-06
        • 1970-01-01
        • 2017-08-22
        • 2019-02-14
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多