我需要对包含非英语字符(西班牙语、法语、德语和俄语)的文本执行正则表达式匹配。
我想让匹配忽略大小写,所以对于英文字符,我只使用/i修饰符,但这不适用于像überm ig这样的单词。
写一个正则表达式的最简单的方法是什么,它既可以匹配üBERM ig,也可以与BERM BERM=ig相匹配?同样的方法可以用来把大写的非英语字母转换成Perl中的小写字母吗?
发布于 2012-10-17 15:08:17
它工作得很好
$ 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“$”,这也可能是因为您使用的是一个旧版本的Perl,它不能正确处理多字符折叠。一般来说,使用/u可能会有所帮助,但对于这个示例来说不应该有什么不同。
发布于 2012-10-17 14:18:58
如果字符串使用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驱动程序中)。
发布于 2012-10-17 14:15:53
如果您使用在Perl脚本中将区域设置为适当的值。,那么/i修饰符将适用于非英语字符--以及其他功能,如单词边界的正则匹配以及uc和lc函数。
注意,如果您需要处理多个外部字符集,链接文档将向您展示如何使用setlocale()在脚本中根据需要切换区域设置。
编辑:--我应该提到,在大多数情况下,这个方法是不推荐的。事情应该只与UTF-8一起工作。但有时还是有用的。
https://stackoverflow.com/questions/12936299
复制相似问题