【问题标题】:Match unicode character in zsh regex匹配 zsh 正则表达式中的 unicode 字符
【发布时间】:2011-12-17 16:54:51
【问题描述】:

我想确保变量不包含特定字符(在本例中为“α”),但以下代码失败(返回 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 和 zsh 4.3.11 且具有相同区域设置的 Linux 机器上进行了测试,并且它在那里工作——即FOO="test" && [[ $FOO =~ '^[^α]*$' ]] 返回成功。我正在运行 Mac OS X 10.7.2。

【问题讨论】:

    标签: regex shell unicode zsh


    【解决方案1】:

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

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

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

    这将检查从头到尾的完整字符串是否包含非“α”字符。

    【讨论】:

    • 哦,对了。所以它不一定需要匹配整个字符串。是的,那你是对的,应该是FOO="test" && [[ $FOO =~ '^[^α]*$' ]]。但这仍然失败。把‘α’改成‘x’是成功的,所以这里用‘α’字符肯定有什么失败的地方。
    【解决方案2】:

    表达这一点的最简单方法是在开头锚定一个否定的前瞻:

    ^(?!.*α)
    

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

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

    【讨论】:

      【解决方案3】:

      由于某种原因,我在构建系统上遇到了类似的问题,而我的笔记本电脑上有 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 版本中得到了相同的结果。不过,我不知道为什么这封信是这里的问题。但是,它可能会帮助某人解决这个缺点。

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多