我需要对包含非英文字符(西班牙语,法语,德语和俄语)的文本执行正则表达式匹配。
我希望匹配忽略大小写,因此对于英文字符,我只使用/i
修饰符,但这不适用于像übermäßig这样的字词。
编写与übermäßig和ÜBERMÄßig相匹配的正则表达式的最简单方法是什么?并且可以使用相同的方法将大写非英语字母转换为Perl中的小写等效字母吗?
答案 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!";