次の1つだけをキャッチしたい:
01 , 02 , ... , 09 , 10 , 11 , 12
次の正規表現は完全ですか、それとも何か見逃していますか?
String monthPat = "^[1][0-2]|[0][1-9]$"
現在の正規表現の問題は、代替を使用して、次の式のいずれかに一致させようとしていることです。
^[1][0-2] # strings that start with '10', '11', or '12'
[0][1-9]$ # strings that end with '01' through '09'
これは、より長い文字列の部分一致が可能であることを意味します。たとえば、「1000」の先頭の「10」と「2009」の末尾の「09」が一致します。
|
これを修正するには、 の両側に両方のアンカーを含めてください。
^1[0-2]$|^0[1-9]$
または、グループ内で交代を行い、アンカーを外側に配置することもできます。
^(1[0-2]|0[1-9])$
意味は同じなので、[1]
とから文字クラス (角括弧) も削除したことに注意してください。[0]
私が見るところ、あなたは検証を行っています。matches
String クラスのメソッドで実行している場合、アンカー^
とアンカー$
は不要です。
文字が 1 つしかない場合は文字クラスが必要ないため、少し短くすることができます。
"1[0-2]|0[1-9]"
上記の改良された正規表現は、指定されたパターンが文字列全体と一致する場合にメソッドが返されるmatches
ため、String クラスのメソッドで使用する場合に使用できます。matches
true
正規表現を単独で考えると、意味が少し異なることに注意してください。
"^[1][0-2]|[0][1-9]$"
これを にフィードしてからclassPattern.compile
を使用するMatcher.find
と、10 から 12 で始まる、または 01 から 09 で終わる部分文字列に一致し^[1][0-2]
ます[0][1-9]$
。に変更します
"^(?:1[0-2]|0[1-9])$"
文字列が正確に 01 から 12 である場合にのみ一致が検出されます。
この知識は、他の言語でコードを記述する場合に役立ちmatch
ます。アンカー^
と$
.