Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于包含特殊字符û;_Regex_String_Perl - Fatal编程技术网

Regex 用于包含特殊字符û;

Regex 用于包含特殊字符û;,regex,string,perl,Regex,String,Perl,在Perl 5.8.5中,我需要编写一个正则表达式,它应该匹配包含扩展拉丁字符集的整个单词。如果我这样写“\b\w+\b”,如果遇到像这样的字符,它就会断开 为了确保在Perl 5.8.5中使用正则表达式对拉丁1(ISO8859-1)字符集(包括所有扩展字符)进行整词匹配,需要做些什么 Perl安装在CentOS 4.6中。Linux中的locale命令提供以下输出: LANG=en_US LC_CTYPE="en_US" LC_NUMERIC="en_US" LC_TIME="en_US" L

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

为了确保在Perl 5.8.5中使用正则表达式对拉丁1(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”进行匹配,那么它也可以与相同的正则表达式配合使用


谢谢您的帮助。

您需要
使用locale
来创建对locale敏感的正则表达式。不过,这也会影响许多其他Perl方面,因此您可能不希望全局启用它。请参阅
perllocale
文档。

正如ikegami所指出的,您可能只是没有解码您的输入。 考虑一下这一班轮(在UTF-8终端上):

由于它在匹配之前对输入字符串进行解码,这要归功于
-Mopen=:std,:utf8
(这也会导致对输出进行编码)。 您可以通过显式解码/编码(通过等)获得相同的结果

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

更多信息:


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

您使用的是perl 5.8.5,这是一个非常旧的perl版本。我不确定该版本的Perl如何支持unicode。Perldoc的网页并没有追溯到很久以前,我无法通过Perlbrew安装它。是否可以更新到较新版本的Perl?如果您对输入进行解码,即使它是iso-8859-1,也可以解决您的问题。
echo "abc grûler xyz" | perl -Mopen=:std,:utf8 -le '$,="\n"; print <> =~ /\b\w+\b/g'
abc
grûler
xyz