匹配zsh正则表达式中的unicode字符

时间:2011-12-17 16:54:52

标签: regex shell unicode zsh

我想确保变量不包含特定字符(在本例中为'α'),但以下代码失败(返回1):

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的Linux机器上进行测试,其中zsh 4.3.11具有相同的语言环境设置,并且它可以正常运行 - 即FOO="test" && [[ $FOO =~ '^[^α]*$' ]]返回成功。我正在运行Mac OS X 10.7.2。

3 个答案:

答案 0 :(得分:1)

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

如果要检查字符串中是否没有此字符,请执行此操作

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

这将检查从开始到结尾的完整字符串是否由非“α”字符组成。

答案 1 :(得分:0)

表达这一点的最简单方法是在开头处锚定负面预测:

^(?!.*α)

这就是说“从一开始就向前看,我不应该在任何地方看到α

使用look-head的优点是它们是非捕获的,因此您可以将它们与其他捕获正则表达式结合起来,例如,在包含的输入中的引号中查找引号中的数字组α,请使用此^(?!.*α)"(\d+)"

答案 2 :(得分: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版本中都得到了相同的结果。不过,我不知道为什么这封信正好在这里。但是,它可能有助于某人解决这个问题。