web-dev-qa-db-ja.com

正規表現のオプション文字の照合方法

これまで正しく動作していたと思っていた正規表現があります。オプションの文字で一致する必要があります。そこにあるかもしれないし、そうでないかもしれない。

ここに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})/
100
jim

つかいます

[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番目の数字のグループをキャプチャしてみませんか?

184
Tim Pietzcker

次のように?を追加することにより、1文字をオプションにすることができます。

([A-Z]{1}?)

量指定子{1}は冗長なので、削除できます。

16
codaddict

単一の文字もオプションとしてマークする必要があります。

([A-Z]{1})? +.*? +

または全体をオプションにする

(([A-Z]{1}) +.*? +)?
6
Stefan