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

标签 regex perl

我正在尝试匹配 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/

相关文章:

python - 有效的域名正则表达式

regex - 如何使用 $1、$2、$3 动态分配哈希

perl - 如何用空格替换无效的 UTF8 字符

python - 为什么我在 Python 而不是 Perl 中得到 hmac 的错误结果?

Javascript 匹配改变不同数组的值

java - 使用正则表达式检查字符串的开头是否与模式匹配

javascript - 这个正则表达式如何匹配到组中

mysql - perl DBD::mysql 不适用于 mysql 5.6?

postgresql - 我可以在连接后定义 DBIx::Class::ResultSource::View 吗?

java - 空格匹配正则表达式 - Java