この数字がこの正規表現と一致するのはなぜですか?

この数字がこの正規表現と一致するのはなぜですか?

正規表現はです-?([0-9]|([1-9][0-9]))

番号-2231が一致します。私が理解したところによれば、1桁または2桁でなければなりません。この数字がこの正規表現と一致するのはなぜですか?

答え1

正規表現は固定されていないため、最初の1つまたは2つの数字を自由に一致させ、「成功」し、次の数字(成功)は一致しないままにします。

1桁または2桁の数字が必要な場合は、正規表現を固定してください。

'^-?([0-9]|([1-9][0-9]))$'

いくつかの例:

$ seq -100 -99 | grep -E '^-?([0-9]|[1-9][0-9])$'
-99

$ seq 99 100 | grep -E '^-?([0-9]|[1-9][0-9])$'
99

$ seq -9 9  | grep -E '^-?([0-9]|[1-9][0-9])$'
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
8
9

$ seq -2231 -100 | grep -E '^-?([0-9]|[1-9][0-9])$'
(empty)

答え2

正規表現パターンを使用するほとんどのプログラムは実際には探す完全な文字列ではないパターンマッチ。 Pythonはユニークですsearch()そしてmatch()search()文字列match()の先頭でのみ一致するメソッドです。オプションで、文字列全体の一致を要求grepできます-x。デフォルトでは、文字列のどこにでも一致します。sed、Perlなどの他のものはawk文字列のどこにでもパターンを見つけるでしょう。^修飾子(「アンカー」)を使用して、$パターンをそれぞれ文字列の先頭または末尾に強制します。

したがって、希望する ERE パターンは次のようになります。

^-?[1-9]?[0-9]$

関連情報