シェルパターンマッチングと算術演算子(+ - * / %)

シェルパターンマッチングと算術演算子(+ - * / %)

これは簡単に見えますが、そうではありません。

[[ "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)\sEREとして認識されません。

答え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]\+\)*//'

関連情報