2011-12-17 140 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版本中都得到了相同的結果。不過,我不知道爲什麼這封信是這裏的問題。但是,它可能有助於人們解決這個缺點。