これまで正しく動作していたと思っていた正規表現があります。オプションの文字で一致する必要があります。そこにあるかもしれないし、そうでないかもしれない。
ここに2つの文字列があります。上の文字列は一致しますが、下の文字列は一致しません。下部の文字列に単一の文字がないことが、失敗の原因です。
開始5桁がある場合は1桁の文字を取得し、存在しない場合は残りの文字列を取得したいです。この文字にはA-Z
を使用できます。
正規表現から([A-Z]{1}) +.*? +
を削除すると、文字以外の必要なものすべてに一致しますが、重要なことです。
20000 K Q511195DREWBT E00078748521
30000 K601220PLOPOH Z00054878524
これが私が使用している正規表現です。
/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/
つかいます
[A-Z]?
文字をオプションにします。 {1}
は冗長です。 (もちろん[A-Z]{0,1}
を書くこともできますが、これは同じ意味ですが、それが?
の目的です。)
あなたの正規表現を改善することができます
^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})
また、ほとんどの正規表現方言では、\d
は[0-9]
と同じです。
^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})
しかし、本当に11個のキャプチャグループが必要ですか?もしそうなら、最後から4番目の数字のグループをキャプチャしてみませんか?
次のように?
を追加することにより、1文字をオプションにすることができます。
([A-Z]{1}?)
量指定子{1}
は冗長なので、削除できます。
単一の文字もオプションとしてマークする必要があります。
([A-Z]{1})? +.*? +
または全体をオプションにする
(([A-Z]{1}) +.*? +)?