gpt4 book ai didi

regex - 如何为俄语字母进行不区分大小写的正则表达式匹配?

转载 作者:行者123 更新时间:2023-12-02 02:34:09 27 4
gpt4 key购买 nike

我有目录路径列表,需要过滤掉其中的一些。我的匹配模式采用非 Unicode 编码。

我尝试了以下方法:

require 5.004;
use POSIX qw(locale_h);
my $old_locale = setlocale(LC_ALL);
setlocale(LC_ALL, "ru_RU.cp1251");

@{$data -> {doc_folder_rights}} =
grep {
# catalog path pattern in $_REQUEST{q}
$_->{doc_folder} =~/$_REQUEST{q}/i;
}
@{$data -> {doc_folder_rights}};

setlocale(LC_ALL, $old_locale);

我需要的是当模式包含俄语字母时不区分大小写的正则表达式模式匹配。

最佳答案

您的代码有几个(潜在的)问题:

  1. 您的代码过滤掉所有$_REQUEST{q} 中的正则表达式匹配的 doc_folder,但是问题表明您想要做相反的事情.

  2. 您可能遇到编码问题。设置语言环境(使用 setlocale)会改变 perl 对大写和小写转换的处理,但不会改变任何编码。您需要确保正确解释 $_REQUEST{q}

为简单起见,您可以假设任何 Perl 字符串都以某种您不需要详细了解的内部表示形式包含 Unicode 数据。只有当 Perl 做 I/O 时,才会有隐式或显式转换。当从 stdin、ARGV 或环境读取时,Perl 假定字节是使用当前语言环境编码的并隐式转换。

如果您有编码问题,有几种方法可以解决:

  1. 修复 Perl 运行的环境,以便它从一开始就知道正确的语言环境。这将修复隐式转换。
  2. 在极少数情况下,$_REQUEST 是从文件句柄加载的,您可以明确地告诉 Perl 使用 binmode($fh, ":encoding(cp1251)");。在阅读 $_REQUEST 之前执行此操作。
  3. $string = Encode::decode(Encoding, $octets) 函数告诉 Perl 忘记它对 $octets 编码的假设,而是处理$octets 的内容作为字节流,需要使用 Encoding 转换为 Unicode。在接触 $octets 的内容之前,您需要这样做,否则可能会发生奇怪的事情。
  4. 由于 $_REQUEST 可能由某些 cgi 模块加载,并且可能在传输过程中进行了 url 编码,您可以告诉 cgi 模块如何正确进行解码。

关于regex - 如何为俄语字母进行不区分大小写的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543694/

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