今まで正しく動作していたと思っていた正規表現があります。オプションの文字に一致させる必要があります。その文字は存在する場合もあれば、存在しない場合もあります。
ここに 2 つの文字列があります。上の文字列は一致しますが、下の文字列は一致しません。下の文字列に 1 文字もないため、失敗します。
最初の 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})/
ベストアンサー1
使用
[A-Z]?
文字をオプションにするには、 を使用します。{1}
は冗長です。 (もちろん、[A-Z]{0,1}
which と書いても同じ意味になりますが、 はその?
ためにあるのです。)
正規表現を次のように改善することができます
^([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 番目の数字のグループをキャプチャしないのはなぜですか?