これは簡単に見えますが、そうではありません。
[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+)* ]] && echo $?
1を返します0
。ただし、マイナス(-
)と乗算(*
)演算子のみが許可されるため、実際には実行しないでください。また、オンラインでいくつかの正規表現ツールを見つけて、このパターンを一致させました。結果は空の文字列です。 (予想通り)
散文では、拡大する正規表現は次のとおりです。
- 番号を探す(必須)
- 少し空白があることを確認してください。
-
演算子はまたはaでなければなりません。*
- 空白があることを再確認してください。
- 他の番号を探す(演算子が前に来る場合は必ず存在する必要があります)
また、括弧内の式の後に続くアスタリスクは、2番目からn番目の演算子番号のペアがオプションであることを示します。
ここで私の考えに何の問題がありますか?
答え1
タグがない場合、正規表現(右側の部分)は次のことができます。どの部分とも一致ひも。したがって、バリアントはと一致します1234
。要件を満たすには、タグを使用する必要があります。
[[ "1234+5678" =~ ^[0-9]+(\s*(\-|\*)\s*[0-9]+)*$ ]] ; echo $?
短く(必要に応じて):
[[ "1234+5678" =~ ^[0-9\ *-]+*$ ]] ; echo $?
答え2
あなたの式は最初の数字と一致するので、0を返します。必要な操作を実行するように正規表現を固定します。
[[ "1234+5678" =~ ^[0-9]+( *(-|\*) *[0-9]+)*$ ]] && echo $?
注:(1)引用は必要ではなく、-
(2)\s
EREとして認識されません。
答え3
[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+) ]] ; echo $?
*
正規表現の末尾に正規表現演算子を使用すると、()内の式を複数回繰り返すことができ、繰り返しは許可されません。したがって、最初から[0-9]+と一致し、残りはオプションです。
これを削除する*
かaに置き換えると、+
式が期待どおりに返されます。
また、括弧内の式の後に続くアスタリスクは、2番目からn番目の演算子番号のペアがオプションであることを示します。
これがエラーです。これは*
any 演算子がオプションであることを意味します。演算子を使用してください+
!
まあ、これは答えではありませんが、式を使用して結果が空であることを確認できます。
echo "1234*5678"|sed 's/[0-9]\+\([ \*\-][0-9]\+\)*//'