2

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

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

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

4

5 回答 5

4

它工作得很好

$ 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,但它不应该对这个例子产生影响。

于 2012-10-17T15:08:17.237 回答
2

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

例如,这会打印“yes”:

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驱动程序都可能)。

于 2012-10-17T14:18:58.083 回答
1

这个对我有用。你需要use utf8;,也许?

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

于 2012-10-17T14:16:22.393 回答
1

如果您在 Perl 脚本中将语言环境设置为适当的值,那么/i修饰符将适用于非英语字符——其他功能(如单词边界的正则表达式匹配和ucandlc函数)也适用。

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

编辑:我应该提到这种方法在大多数情况下已被弃用。事情应该只适用于 UTF-8。但有时它仍然有用。

于 2012-10-17T14:15:53.277 回答
0
use locale;
use POSIX qw(locale_h);
setlocale (LC_ALL, $locale{German}) or die "failed to load locale!";
于 2012-10-17T14:20:12.980 回答