2016-06-20 5 views
3

を読んでcomment by Charles Duffy私は疑問を見つけました:単純な正規表現を確認するのに、=または=~を使用することに違いはありますか?=と=〜は簡単な正規表現をチェックするのと同じですか?

我々は単なる文字列を別の文字列の一部であるかどうかを確認したい場合は、これらのオプションは等価です:

$ re="[0-9]" 
$ number=2 
$ [[ $number = $re ]] && echo "yes" 
yes 
$ [[ $number = *$re* ]] && echo "yes" 
yes 

:変数に格納が正規表現ならば

$ [[ hello = *el* ]] && echo "yes" 
yes 
$ [[ hello =~ el ]] && echo "yes" 
yes 

同じことが起こりますただし、リテラル以外の文字列をチェックすると=では機能せず、=~の使用が必要です。

$ date=20160620 
$ [[ $date = [0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1]) ]] && echo "yes" 
bash: syntax error in conditional expression: unexpected token `(' 
bash: syntax error near `[0-9]{4}(0' 
$ [[ $date =~ [0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1]) ]] && echo "yes" 
yes 
$ [[ $date =~ ^[0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])$ ]] && echo "yes" 
yes 

一般的なパフォーマンスとPOSIXには何を使用すべきですか?

これらのすべては、私のGNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)に基づいています。

+2

globbingとRegexの違いは何ですか。 '='はグロブを使いますが、 '=〜'は正規表現を使います。 – heemayl

+1

選択肢がある場合は、効率を上げるために正規表現を使用します。それは通常より速いです。 http://stackoverflow.com/q/18412294/1566221を参照してください。しかし、正規表現はposixではありません。 – rici

答えて

2

BASHの===を使用して、グロブパターンマッチングのみがサポートされています。

最初の2つの例は、最初に*el*(glob)と一致し、2番目の例ではel(globまたはregexまたはプレーンな文字列で同じです)と同じ結果を生成しています。

しかし、文字クラス、数量子、アンカーなどを使用して正規表現を使用する場合は、=~を使用して正規表現に一致させる必要があります。

これは、シェルが指定された正規表現をグロブパターンとして解釈しようとしているため、2番目のブロックの構文エラーの原因です。


Bash Reference Manual → 3.2.4.2 Conditional Constructsから:

[[ expression ]] 

'==' と演算子が使用されている、 の右側オペレータに文字列がかかるパターンとみなされ、一致しています '=!'あたかもextglob シェルオプションが有効になっているかのように、Pattern Matchingに記載されている のルールに従います。 '='演算子は '=='と同じです。

追加の2項演算子 '=〜'が利用可能で、同様の 優先度は '=='と '!='と同じです。これを使用すると、演算子の右の文字列 は拡張正規表現とみなされ、 が一致します(regex3のように)。

+1

ああ、素敵! [Bashリファレンスマニュアル - 3.2.4.2条件コンストラクト](https://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs)、_ =〜(...)演算子の右側にある文字列は拡張正規表現と見なされ、それに対応します。一方、 '=='と '!= '演算子が使用されている場合、演算子の右側の文字列はパターンとみなされ、あたかもextglobシェルオプションが有効になっているかのようにパターンマッチングの後述の規則に従って照合されます。どうもありがとう! – fedorqui

+0

正しい '='、 '!='、 '=='も拡張グロブパターンをサポートしています – anubhava

+1

これではっきりしました。あなたが気にしないなら、私はあなたの答えに参照を追加するので、それは受け入れられることが完全です。ありがとう! – fedorqui

関連する問題