Perl正则表达式用于包含特殊字符û的整个单词匹配

时间:2014-07-14 13:20:08

标签: regex string perl

在Perl 5.8.5中,我需要编写一个正则表达式,它应该匹配包含扩展latin1字符集的整个单词。如果我这样写它是“\ b \ w + \ b”,如果它遇到像这个'û'这样的字符,它会中断。

确保在Perl 5.8.5中使用正则表达式匹配整个单词时,需要做什么才能使用Latin1(ISO8859-1)字符集,包括所有扩展字符?

Perl安装在CentOS 4.6中。 Linux中的locale命令提供以下输出:

LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

对于给定的单词,例如。 “abcgrûlerxyz”,不应搜索字符串“gr”的整个单词匹配的正则表达式,在我的情况下搜索的是“grûler”这个单词的子字符串。正则表达式是:

$string =~ /\b\w+\b/;

输出为“gr”,这是不正确的,因为它是一个子串,如上所述。

另外,我不想完全排除扩展字符的匹配。如果需要对整个单词“grûler”进行匹配,那么它也应该与相同的正则表达式一起正常工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如ikegami指出的那样,你可能根本就没有解码你的输入。 确实考虑这个单行(在UTF-8终端上):

echo "abc grûler xyz" | perl -Mopen=:std,:utf8 -le '$,="\n"; print <> =~ /\b\w+\b/g'

给出了预期的匹配:

abc
grûler
xyz

因为它在匹配之前解码输入字符串,感谢-Mopen=:std,:utf8(这也导致输出被编码)。 您可以通过显式解码/编码(通过Encode等)获得相同的内容。

现在从上面的单行中删除-Mopen=:std,:utf8,您将获得与您描述的相同的意外匹配(在'gr'子字符串上)。

更多相关信息:The "Unicode Bug"

我不知道这个旧的perl是否还有其他问题(perl 5.8.8应该可以工作)。

答案 1 :(得分:0)

您需要use locale才能拥有对区域设置敏感的正则表达式。这会影响许多其他Perl方面,因此您可能不希望全局启用它。请参阅perllocale文档。