パターン「^-0+([0-9]+)」は「^-0+([1-9]+)」と同じですか?

パターン「^-0+([0-9]+)」は「^-0+([1-9]+)」と同じですか?

Jeffは次のように書きました。負の名前のファイル名のパラメータ拡張エラー

[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}この時点で最良の方向は、負の数になる可能性がある数字から前のゼロを削除するなどの操作を実行することです。

0パターンの開始番号が必ず必要かどうか疑問に思います。つまり、^-0+([0-9]+)パターンはと同じですか^-0+([1-9]+)?ありがとうございます。

答え1

いいえ、^-0+([1-9]+)そのような数字は一致しません-320

-320編集:パターンをもう一度読むと、実際には不一致の2つの理由があります。

  1. 0後ろには'がありません-+必ずあるべきだと言います)。しかし、これは両方のモードの違いではなく、欠陥である可能性があります。

  2. 0ゼロ以外の最初の数字の後にはパターン間の違いがあります。

答え2

同じ文字列と一致するかどうかは、^-0+([0-9]+)ロケールによって異なります。 C / POSIXロケールでは同じ文字列(および含む)と一致しますが、キャプチャする内容は異なる場合があります(たとえば、前者はからキャプチャし、後者はでキャプチャ)。^-0+([1-9]+)$-01foo-00230bar(...)230-00230bar23

@Henrikが提案したように使用すると、$同じ文字列では一致しません。^-0+([1-9]+)$一致しません-00230

他の地域ではマイレージが異なる場合があります。たとえば、en_GB.UTF-8Solaris 10システムのロケールでは、onは中間にソートされた文字であるため、一致するため、^-0+([0-9]+)orは一致しますが、⓿または⓿は一致しません。-0⓿⓿1201[0-1][0-9]^-0+([1-9]+)0+[1-9]

完全性のために/拡張shに依存せずに標準構文を使用してこれを行うには、次のようにします。bashksh93

case ${b#-0} in
  ("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
  (*) b=${b#"${b%%[!0-]*}"};;
esac

ここでの利点は[[:digit:]](とは対照的に[0-9])一致するだけです0123456789

関連情報