【问题标题】:Perl regex for whole word match containing special character û包含特殊字符 û 的整个单词匹配的 Perl 正则表达式
【发布时间】:2014-07-14 13:20:08
【问题描述】:

在 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=

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

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

输出是“gr”,这是不正确的,因为它是一个子字符串。

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

感谢您的帮助。

【问题讨论】:

  • 您使用的是 Perl 5.8.5,它是 Perl 的一个非常旧的版本。我不确定那个版本的 Perl 是如何支持 unicode 的。 Perldoc 的网页并没有那么远,我无法通过 Perlbrew 安装它。是否可以更新到更新版本的 Perl?
  • 如果你解码你的输入,即使它是 iso-8859-1,它会解决你的问题。

标签: regex string perl


【解决方案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 应该可以工作)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多