我正在尝试匹配 Perl 中的货币值。在英国,我将首先仅匹配 £
,稍后将扩展到其他货币,因此为了表示这一点,我将 £
字符放入一个字符集。代码如下所示:
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;
现在数字被打印出来。请注意,我从正则表达式中删除了 []
。字符集不是要匹配它们所包含的任何值吗?更奇怪的是,如果我将正则表达式和输入文件中的 £
字符替换为 ASCII 字符,例如 E
,即使它包含在字符集。
脚本和输入文件都是 UTF-8,我使用的是 Perl 5.18.2,我导入的唯一模块是 Moose。
最佳答案
您使用什么编码? UTF-8?你告诉 Perl 你这样做了吗?
use utf8; # The source is in UTF-8.
此外,如果 $input 来自文件,您是否告诉 Perl 它使用什么编码?
open my $HANDLE, '<:encoding(utf-8)', 'input.txt' or die $!;
关于regex - 当我使用一字符长字符集时,为什么我的正则表达式不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784789/