3

次の1つだけをキャッチしたい:

01 , 02 , ... , 09 , 10 , 11 , 12

次の正規表現は完全ですか、それとも何か見逃していますか?

String monthPat = "^[1][0-2]|[0][1-9]$"
4

2 に答える 2

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]

于 2013-01-25T16:20:01.220 に答える
1

私が見るところ、あなたは検証を行っています。matchesString クラスのメソッドで実行している場合、アンカー^とアンカー$は不要です。

文字が 1 つしかない場合は文字クラスが必要ないため、少し短くすることができます。

"1[0-2]|0[1-9]"

上記の改良された正規表現は、指定されたパターンが文字列全体と一致する場合にメソッドが返されるmatchesため、String クラスのメソッドで使用する場合に使用できます。matchestrue

正規表現を単独で考えると、意味が少し異なることに注意してください。

"^[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ます。アンカー^$.

于 2013-01-25T16:20:59.333 に答える