无法在正则表达式 (\x{00E7}) 中匹配 Perl 中的 unicode 字符

Unable to match unicode character in Perl in regex (\x{00E7})

提问人:nevinleiby 提问时间:7/17/2021 更新时间:7/17/2021 访问量:173

问:

我已经使用 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 和大量其他资源,但我完全被难住了。

非常感谢!!

正则表达式 perl unicode utf-8

评论

0赞 ikegami 7/17/2021
在某些地方,您说您正在搜索 .在其他情况下,.然后你展示了你的输入,其中包含 .下定决心!回复“无论我做什么,这个正则表达式似乎都很少匹配”,但事实并非如此。你甚至表明这不是真的。 (通常写成 或 ,以及 的简写 )匹配大量字符:所有标点符号、所有字母、所有符号、所有标记和所有分隔符。其中一个角色是 .你展示了模式匹配,不是一次,而是两次!你没有说代码应该做什么!çÇ\P{c}\PC\P{C}\P{General_Category=Other}7
0赞 ikegami 7/17/2021
对于所有这些问题,这个问题是无法回答的。请编辑您的问题以解决这些问题。

答:

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;