在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”进行匹配,那么它也应该与相同的正则表达式一起正常工作。
感谢您的帮助。
答案 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
文档。