当我使用一个字符长的字符集时,为什么我的正则表达式不匹配?

时间:2014-09-11 10:14:33

标签: regex perl

我试图在Perl中匹配货币值。在英国,我将开始只匹配£ s,稍后将分支到其他货币,所以为了表示我将£字符放在字符集中。代码如下所示:

my $re = qr/ Spent \s+ [£] (?<amount> \d+) /x;
if ( $input =~ $re ) {
    print $+{amount};
}

这是一个示例输入文件:

- Spent £6 on beer
- Spent £4 on sobriety pills

然而如果我运行这个文件,它什么都不匹配!但是,如果我从其字符集中删除£

my $re = qr/ Spent \s+ £ (?<amount> \d+) /x;

现在这些数字会被打印出来。请注意,我从正则表达式中删除了[]。 Aren的字符集是否与其所附值相匹配?甚至更奇怪的是,如果我用正则表达式替换正则表达式和输入文件中的£字符,例如E,即使它是正常的,它也可以正常工作用字符集括起来。

脚本和输入文件都是UTF-8,我在Perl 5.18.2上,我导入的唯一模块是Moose。

2 个答案:

答案 0 :(得分:2)

您使用什么编码? UTF-8?你告诉Perl你这样做了吗?

use utf8; # The source is in UTF-8.

另外,如果$ input来自文件,你告诉Perl它使用了什么编码吗?

open my $HANDLE, '<:encoding(utf-8)', 'input.txt' or die $!;

答案 1 :(得分:2)

£替换为其unicode:

my $re = qr/ Spent \s+ [\u00A3] (?<amount> \d+) /x;