gpt4 book ai didi

regex - Perl 预编译正则表达式 - utf8

转载 作者:行者123 更新时间:2023-12-04 18:50:57 26 4
gpt4 key购买 nike

当我做:

use strict; use warnings;
my $regex = qr/[[:upper:]]/;
my $line = MyModule::get_my_line_from_external_source(); #file, db, etc...
print "upper here\n" if( $line =~ $regex );

perl 如何知道它何时必须只匹配 ascii uppercaseutf8 uppercase ?
它是一个预编译的正则表达式 - 所以有点 perl 必须知道,什么是大写。取决于区域设置?如果是,如何将“C”语言环境中的 utf8 大写与预编译的正则表达式匹配?

根据 tchrist 的评论更新:
use strict; use warnings; use Encode;
my $regex = qr/[[:upper:]]/;

my $line = XXX::line();
print "$line: upper1 ", ($line =~ $regex) ? "YES" : "NO", "\n";

my $uline = Encode::decode_utf8($line);
print "$uline: upper2 ", ($uline =~ $regex) ? "YES" : "NO", "\n";

package XXX;
sub line { return "alpha-Ω"; } #returning octets - not utf8 chars

输出是:
alpha-Ω: upper1 NO
alpha-Ω: upper2 YES

这是什么意思,预编译的正则表达式不是“硬预编译”而是“软预编译” - 所以 perl 根据匹配的 $line 的 utf8 标志替换 '[[:upper:]]' 。

最佳答案

在 Perl 5.14 之前,这不是很好定义。

在 5.14 中,模式知道它是如何编译的,你有 /u , /l , /d , /a , 或 /aa模式修饰符。你也可以说

use re "/u";

或者
use re "/msu";

在词法范围内打开所有这些标志。

例如,在 5.14 下:
% perl -le 'print qr/foo/'
(?^:foo)
% perl -E 'say qr/foo/'
(?^u:foo)
% perl -E 'say qr/foo/l'
(?^l:foo)

我会避开语言环境;只需使用全 Unicode。

顺便说一句,我会确保“外部来源”给你一个正确解码的字符串;也就是说,打开了它的 UTF8 标志。字符函数在编码字符串上效果不佳,因为它们确实需要解码字符串。

关于regex - Perl 预编译正则表达式 - utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com