我想确保变量不包含特定字符(在本例中为'α'),但以下代码失败(返回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。
答案 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版本中都得到了相同的结果。不过,我不知道为什么这封信正好在这里。但是,它可能有助于某人解决这个问题。