Perl Regex(\ d * \。\ d {2})

时间:2012-01-16 22:19:18

标签: regex perl

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

以下是代码:

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

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

<amount>23.00000</amount>

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

如果您需要至少一个小数位,则需要使用\d*\.\d+;如果小数位数在2到5之间,则需要\d*\.\d{2,5}

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

所以你想使用:

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

答案 2 :(得分:0)

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

所以\ d {2}只匹配两位数字,而输入文字则只有五位数。

如果您不想使用尾随数字,则可以使用捕获括号外的\ d *将其丢弃。

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

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

此外,如果要解析XML,则可能需要考虑使用XML::LibXML等XML库。