2011-12-17 101 views
4

我想确保一个变量不包含特定字符(在这种情况下,“α”),但下面的代码失败(返回1):匹配Unicode字符

FOO="test" && [[ $FOO =~ '^[^α]*$' ]] 

编辑:根据以下stema的反馈更改模式,要求仅匹配从开始到结束的“非α”字符。

用例如, 'x'按预期工作。为什么它会以'α'失败,我该如何完成这项工作?

系统信息:

$ zsh --version 
zsh 4.3.11 (i386-apple-darwin11.0) 
$ locale 
LANG="en_GB.UTF-8" 
LC_COLLATE="en_GB.UTF-8" 
LC_CTYPE="en_GB.UTF-8" 
LC_MESSAGES="en_GB.UTF-8" 
LC_MONETARY="en_GB.UTF-8" 
LC_NUMERIC="en_GB.UTF-8" 
LC_TIME="en_GB.UTF-8" 
LC_ALL="en_GB.UTF-8" 

编辑2:我现在测试运行Ubuntu 11.10与4.3.11的zsh具有相同区域设置在Linux机器上,并且有它的工作原理 - 即FOO="test" && [[ $FOO =~ '^[^α]*$' ]]回报的成功。我正在运行Mac OS X 10.7.2。

回答

1

与此正则表达式.*[^α].*您无法测试α不在字符串中。测试的内容是:字符串中是否有一个字符不是α

如果你想检查没有这个字符字符串中,做到这一点

FOO="test" && [[ $FOO =~ '^[^α]*$' ]] 

这将检查是否从开始到结束的整个字符串包含非“α”的字符。

+0

哦,对。所以它不一定需要匹配整个字符串。是的,那么你是对的,它应该是'FOO ='test'&& [[$ FOO =〜'^ [^α] * $']]''。但那仍然失败。将“α”更改为“x”会成功,因此在此处使用“α”字符时必定会有失败的情况。 – beta 2011-12-18 09:28:20

0

表达这种最简单的方法是在开始挂靠负前瞻:

^(?!.*α) 

这是说:“从一开始就期待的时候,我不应该能够看到α任何地方。

使用查找头的优点是它们是非捕获,这样你就可以将它们与其他捕获正则表达式相结合,如发现在报价号码组中输入该包含α,使用这个:^(?!.*α)"(\d+)"

0

出于某种原因,我在构建系统上遇到了类似的问题,而在我的笔记本上使用了ZSH版本5.0.2(Unicode的预期工作情况)和ZSH 4.3.17。在我看来,ZSH 5在正则表达式模式中没有Unicode字符的问题。

具体而言,解析键/值对:

[[ "revision/author=Ľudovít Lučenič" =~ '^([^=]+)=(.*)$' ]] 
echo "$match[1]:$match[2]" 

呈现

:        # ZSH 4.3.17 
revision/author:Ľudovít Lučenič # ZSH 5.0.2 

另外,我假定一些缺点与一般ZSH 4 Unicode支持。

更新:经过一番调查,我发现正则表达式中的点与ZSH 4中的字母'č'不匹配。一旦我将模式更新为:

[[ "revision/author=Ľudovít Lučenič" =~ '^([^=]+)=((.|č)*)$' ]] 
echo "$match[1]:$match[2]" 

我在两个ZSH版本中都得到了相同的结果。不过,我不知道为什么这封信是这里的问题。但是,它可能有助于人们解决这个缺点。