提问人:nevinleiby 提问时间:7/17/2021 更新时间:7/17/2021 访问量:173
无法在正则表达式 (\x{00E7}) 中匹配 Perl 中的 unicode 字符
Unable to match unicode character in Perl in regex (\x{00E7})
问:
我已经使用 Perl 一段时间了,但我一直挂在匹配输入文件中的 unicode 数据上。其中大多数是货币符号,但似乎不能完全预测。包括来自世界各地的各种货币,我正在尝试将 unicode 符号转换为 3 个字母的缩写。
我正在尝试匹配在某些情况下出现的 ç 当我扫描欧元欧元的文件时。该模式似乎无法识别 ç。
这是我到目前为止所拥有的:
use strict;
use utf8;
#binmode(STDOUT, ":utf8");
use open qw/:std :utf8/;
open (FILE_INPUT, "$source_file") || die "Unable to open source file: $source_file: $!\n";
LINE: while (my $line_input = <FILE_INPUT>)
{
chomp $line_input;
....
$input_price = '7.50 Ç';
## This regex rarely seems to match, no matter what I do:
if ($input_price =~ /\s?\P{c}\s?/)
{
## We have a match! Please remove this unicode:
$input_price =~ s/(\P{c})/EUR /;
print "Converted price field: ($input_price)\n";
}
}
但是我的输出是:
EUR.50 Ç
我还尝试了使用 \x 和 UTF-8 代码的各种形式来尝试显式匹配字符,但正则表达式不匹配:https://www.compart.com/en/unicode/U+00E7
例如:
if ($input_price =~ /\x{e7}/) { ... }
if ($input_price =~ /\x{00e7}/) { ... }
if ($input_price =~ /\x{c3}/) { ... }
if ($input_price =~ /\x{00c3}/) { ... }
if ($input_price =~ /\x{a7}/) { ... }
if ($input_price =~ /\x{00a7}/) { ... }
if ($input_price =~ /\x{0063}/) { ... }
if ($input_price =~ /\x{0327}/) { ... }
而且没有一场比赛发生。我通读了 Perl 编程、http://www.regular-expressions.info/unicode.html 和大量其他资源,但我完全被难住了。
非常感谢!!
答:
1赞
Polar Bear
7/17/2021
#1
请调查以下代码片段是否符合您的问题。
注意:运行script.pl inputfile.dat
use strict;
use warnings;
binmode(STDOUT, ':utf8');
s/ (Ç|ç)/ EUR/g && print while <>;
数据输入文件
7.50 Ç
7.50 ç
输出
7.50 EUR
7.50 EUR
注意:在 Windows 10 代码页 437 中测试
以下代码片段产生相同的结果
use strict;
use warnings;
my $fname = 'utf8_regex.dat';
open my $fh, '<', $fname or die $!;
s/ (Ç|ç)/ EUR/g && print while <>;
close $fh;
评论
ç
€
Ç
\P{c}
\PC
\P{C}
\P{General_Category=Other}
7