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

时间:2012-10-17 14:11:29

标签: regex perl utf-8

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

我希望匹配忽略大小写,因此对于英文字符,我只使用/i修饰符,但这不适用于像übermäßig这样的字词。

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

5 个答案:

答案 0 :(得分:3)

完美无缺

$ 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

use utf8;表示源代码是使用UTF-8编码的。不可能以任何其他方式在脚本中包含这些字符。)

我怀疑编码问题,这意味着你认为你没有给Perl“ß”。也可能是因为您使用的旧版本的Perl无法正确处理多字符折叠。一般来说,它可以帮助使用/u,但它不应该对这个例子产生影响。

答案 1 :(得分:2)

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

例如,这会打印“是”:

perl -le 'use utf8; print "yes" if "ÜBERMäßig" =~ /überMÄßiG/i'

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

如果您的字符串来自其他地方,那么您可能需要应用Encode::decode - 或者告诉您的来源生成正确解码的字符串(例如,大多数DBI驱动程序都可以)。

答案 2 :(得分:1)

如果您set the locale to the appropriate value in your Perl script,那么/i修饰符将适用于非英文字符 - 其他功能(如字边界的正则表达式匹配以及uc和{{1})也是如此函数。

请注意,如果您需要处理多个外部字符集,链接的文档将向您展示如何使用setlocale()根据需要在脚本中切换区域设置。

编辑:我应该提到在大多数情况下不推荐使用此方法。事情应该适用于UTF-8。但它有时仍然有用。

答案 3 :(得分:1)

It works for me.您需要use utf8;吗?

(免责声明:我不知道Perl。)

答案 4 :(得分:0)

use locale;
use POSIX qw(locale_h);
setlocale (LC_ALL, $locale{German}) or die "failed to load locale!";