2011-12-17 16 views
4

私は、変数が特定の文字(この場合の「α」)が含まれていないことを確認するが、次のコードは、失敗した(リターン1):マッチUnicode文字

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

編集:以下のステムからのフィードバックに基づいてパターンを変更し、最初から最後までの「非 'α'」文字のみを一致させる必要があります。

「α」をたとえば'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:私は今、Linuxマシンが同一のロケール設定でのzsh 4.3.11でのUbuntu 11.10を実行する上でテストされ、そしてそこにそれが動作する - すなわち、成功を返しFOO="test" && [[ $FOO =~ '^[^α]*$' ]]。私はMac OS X 10.7.2を使用しています。

答えて

1

この正規表現を使用してをテストすることはできません。αは文字列に含まれていません。これはテストです:αではない文字列内に文字が1つありますか?

あなたは文字列にこの文字がないことを確認したい場合は、行うこの

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

開始から終了までの完全な文字列が非「α」の文字で構成されている場合、これはチェックします。

+0

よろしいですか。したがって、文字列全体を必ずしも一致させる必要はありません。うん、あなたは正しいです、それは 'FOO =" test "&& [[$ FOO =〜 '^ [^α] * $']]'でなければなりません。しかしそれはまだ失敗します。 'α'を 'x'に変更すると、ここで 'α'文字を使用すると失敗するものがなければなりません。 – beta

0

これを表現する最も簡単な方法は、開始時に固定された負の先読みを使用することです:

^(?!.*α) 

は、これは最初から楽しみにしていたとき、私はどこでもαを見ることができないはず」と言っています。

ルックヘッドを使用することの利点彼らは非キャプチャされている、あなたは、αが含まれていないことを入力して引用符で囲まれた数字のグループを見つけるために、例えば、他のキャプチャ正規表現で使用し、それらを組み合わせることができますので、 this:^(?!.*α)"(\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 Unicodeサポートといくつかの欠点を想定し、また

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

レンダリングします。

更新:いくつかの調査の後、私はregexpのドットがZSH 4の文字 'č'と一致しないことを発見しました。パターンを更新した後:

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

私は両方のZSHバージョンで同じ結果を得ています。しかし、なぜこの手紙がここで問題になるのかは分かりません。しかし、それは誰かがこの欠点を回避するのを助けるかもしれません。

関連する問題