正規表現のオプション文字との一致方法


147

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

ここに2つの文字列があります。上の文字列は一致しますが、下の文字列は一致しません。下の文字列に単一の文字がないことは、それを失敗させています。

最初の5桁の数字がある場合はそれを取得し、ない場合は残りの文字列を取得します。この手紙はすることができます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})/

回答:


246

使用する

[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番目の数字のグループをキャプチャしないのですか?


ティム、正直なところ、この正規表現を書いていないので確信が持てません。私はまだ正規表現にかなり新しいです。これを書くより良い方法を見つけたら、私は提案を受け入れるつもりです。
jim

1
ティム、あなたの例は、その位置に文字があるかどうかに関係なく、両方の文字列で機能します。ありがとう。
ジム

26

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

([A-Z]{1}?)

数量詞{1}は冗長なので、削除できます。


codeaddictに感謝します。疑問符は `+。*の代わりになりますか?+ `?
jim

grep regexを使用する場合、{1}をドロップするとエラーが発生します(grep:後読みアサーションは固定長ではありません)。だから、それを残すためのケースです。
Zunderscore

6

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

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

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

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

1
ステファン、手紙を完全にオプションにしたいと思います。私はこれらの両方を試しましたが、それでも何にもマッチしません。私はそれを間違っていると確信しています。文字列に含めるように例を変更できますか?
jim

0

また、あなたが望むもの(.*)\/(([^\?\n\r])*)$2一致するようなあなたのケースのために設計されたより単純な正規表現を使用することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.