Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 非英语字符的不区分大小写的正则表达式_Regex_Perl_Utf 8 - Fatal编程技术网

Regex 非英语字符的不区分大小写的正则表达式

Regex 非英语字符的不区分大小写的正则表达式,regex,perl,utf-8,Regex,Perl,Utf 8,我需要对包含非英语字符(西班牙语、法语、德语和俄语)的文本执行正则表达式匹配 我希望匹配忽略大小写,因此对于英语字符,我只使用/I修饰符,但这对übermäig之类的词不起作用 最简单的编写正则表达式的方法是什么,比如说,同时匹配übermäßig和ÜbermÄßig?在Perl中,是否可以使用相同的方法将大写非英语字母转换为小写等效字母?如果可以,则/i修饰符将用于非英语字符,其他功能如单词边界的正则表达式匹配以及uc和lc函数也可以 请注意,如果需要处理多个外来字符集,链接的文档将向您展示如

我需要对包含非英语字符(西班牙语、法语、德语和俄语)的文本执行正则表达式匹配

我希望匹配忽略大小写,因此对于英语字符,我只使用
/I
修饰符,但这对übermäig之类的词不起作用

最简单的编写正则表达式的方法是什么,比如说,同时匹配übermäßig和ÜbermÄßig?在Perl中,是否可以使用相同的方法将大写非英语字母转换为小写等效字母?

如果可以,则
/i
修饰符将用于非英语字符,其他功能如单词边界的正则表达式匹配以及
uc
lc
函数也可以

请注意,如果需要处理多个外来字符集,链接的文档将向您展示如何根据需要在脚本中使用切换语言环境

编辑:我应该提到,这种方法在大多数情况下是不推荐的。使用UTF-8就可以了。但有时它仍然有用。

您需要
使用utf8,也许


(免责声明:我不懂Perl。)

如果字符串使用Perl的内部编码,
/I
修饰符可以很好地工作

例如,这会打印“是”:

使用utf8
”告诉Perl我的源代码是用UTF-8编码的,因此Perl将源代码中的所有文本字符串从UTF-8解码为其内部编码。如果不使用utf8,此示例将无法运行


如果您的字符串来自其他地方,那么您可能需要应用——或者告诉您的源代码生成正确解码的字符串(例如,大多数
DBI
驱动程序都可能使用)。它工作得非常好

$ perl -E'use utf8; say "ÜBERMÄẞIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match

$ perl -E'use utf8; say "ÜBERMÄSSIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match
(使用utf8;
说明源代码是使用UTF-8编码的。脚本中不可能以其他方式包含这些字符。)


我怀疑是编码问题,也就是说,您认为您给出了Perl“ß”,而实际上没有。也可能是因为您使用的是旧版本的Perl,无法正确处理多字符折叠。一般来说,使用
/u
,可能会有所帮助,但对这个例子来说应该没有什么区别。

你知道
übermßig
的正确大写版本是
ÜbermÄSSIG
,对吧?事实上,不,我不会说德语。维基百科似乎表明ß没有大写字母,但我想我误解了。我刚刚检查了/ß/I是否与SS匹配,但它不匹配。你知道我如何做到这一点吗?Unicode中有一个大写字母“ß”(“ẞ", 但“ß”的正确大写字母是“SS”(根据Unicode)ẞ)返回
SS
使用区域设置是过时的,不完全受支持。大多数系统都有非常不稳定的区域设置。使用区域设置是过时的,不完全受支持。大多数系统都有非常不稳定的区域设置。这是不需要的。
use locale;
use POSIX qw(locale_h);
setlocale (LC_ALL, $locale{German}) or die "failed to load locale!";
$ perl -E'use utf8; say "ÜBERMÄẞIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match

$ perl -E'use utf8; say "ÜBERMÄSSIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match