以下の形式である必要がある入力文字列を検証する必要があります。
<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter>
例:RX-EZ12345678912345B
このようなことを試しまし^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}
たが、期待した結果が得られません。
どんな助けでも大歓迎です。
ありがとう
以下の形式である必要がある入力文字列を検証する必要があります。
<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter>
例:RX-EZ12345678912345B
このようなことを試しまし^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}
たが、期待した結果が得られません。
どんな助けでも大歓迎です。
ありがとう
あなたの最大の問題は[IN]
、最初の です。これは 1 文字のみに一致し、それがI
またはの場合にのみ一致しN
ます。任意の文字の 2 つを一致させたい場合は、 を使用します[A-Z]{2}
。
それを修正しても、正規表現は引き続きRX-E
. これ[A-Z]{0,2}?
は、気が進まない量指定子 のおかげで、最初は何も消費しようとしないため{0,2}?
です。次に\d{0,14}
、ゼロ桁に一致し、. を[A-Z]{0,1}
貪欲に消費しE
ます。
2 文字と 14 桁を正確に一致させたい場合は、 と を使用[A-Z]{2}
し\d{14}
ます。また、文字列を検証しているので、正規表現を終了アンカーで終了する必要があります$
。結果:
^[A-Z]{2}-[A-Z]{2}\d{14}[A-Z]$
...または、Java 文字列リテラルとして:
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
@nhahtdhが観察したように、正規表現を適用するためにJavaのメソッドを使用している場合、アンカーを実際に使用する必要はありませんが、matches()
とにかくそうすることをお勧めします. 意図をよりよく伝え、別のフレーバー/コンテキストで使用する必要がある場合に備えて、正規表現を移植可能にします。
編集:最初の 2 文字が正確IN
に である必要がある場合は、次のようになります。
^IN-[A-Z]{2}\d{14}[A-Z]$
^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$
これで目的が解決するはずです。こちらからご確認いただけます
現在の正規表現の最初で何をしようとしているのかわかりません。
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
上記の正規表現は、指定した入力文字列と厳密に一致します。matches
関数^
を使用する場合は、$
省略される場合があります。
正確な繰り返し回数が必要なので、{<number>}
only と指定する必要があります。{<number>,<number>}
可変回数の繰り返しに使用されます。そして?
、前のトークンが表示される場合と表示されない場合があることを指定します-存在する必要がある場合、指定?
は正しくありません。
要件を単純に Java 正規表現に変換します。
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
これにより、次を使用できるようになります。
if (!input.matches("^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$")) {
// do something because input is invalid
}
これで問題が解決するはずです。有効期限はこちら
^[A-Z]{2}-[A-Z]{2}[0-9]{14}[A-Z]$
^([A-Z]{2,2}[-]{1,1}[A-Z]{2,2}[0-9]{14,14}[A-Z]{1,1}){1,1}$