1. ホーム
  2. regex

[解決済み】Regex 任意の文字にマッチさせる方法

2022-04-17 18:10:26

質問

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

ここに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桁目から最後の桁のグループをキャプチャしないのでしょうか?