我在Perl中遇到了一个似乎给我带来问题的正则表达式。我对Perl很新 - 但我认为这不是我的问题。
以下是代码:
if ($line =~ m/<amount>(\d*\.\d{2})<\//) { $amount = $1; }
我实际上是在解析单个标记的XML格式文件。这是我要解析的具体值。
<amount>23.00000</amount>
有人可以解释为什么我的正则表达式不起作用吗?
编辑:我应该提到我正在尝试将金额作为货币值导入。尾随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库。