次の番号範囲の正規表現を生成しようとしています...
開始番号として00001または0000001が必要です。
ISRAEL NNNNN 00001 99999
NNNNNNN 0000001 9999999
私はこの正規表現で試しています:^0*[0-9]{5}$|^0*[0-9]{7}$
ただし、次のシナリオでは失敗します。あるべきではないこれらの番号を受け入れます。
0100012
000010121
次の番号範囲の正規表現を生成しようとしています...
開始番号として00001または0000001が必要です。
ISRAEL NNNNN 00001 99999
NNNNNNN 0000001 9999999
私はこの正規表現で試しています:^0*[0-9]{5}$|^0*[0-9]{7}$
ただし、次のシナリオでは失敗します。あるべきではないこれらの番号を受け入れます。
0100012
000010121
先行番号が含まれているかどうかを質問から判断することは不可能なので、次の2つのバージョンがあります。
先頭の数字を含む:
^(00)?0{4}1\s+[0-9]{5}([0-9]{2})?$
先頭の数字なし:
^[0-9]{5}([0-9]{2})?$
(00)?0{4}1
「2オプション0
、次に4 0
、次に1
」 を意味します[0-9]{5}([0-9]{2})?
「5桁、次にオプションの2桁」を意味しますOPが求めているのは、5桁または7桁すべてのうち、少なくとも1つがゼロ以外になるようにする正規表現の書き方だと思います(おそらく、郵便番号をすべてゼロにすることはできません)。
明らかに、正規表現を使用せずにこれを行う方がはるかに簡単です。整数を解析し、それがゼロより大きく、100000または1000000より小さいかどうかを確認すれば、完了です。もちろん、ユーザーにコードの前に余分なゼロを入力させたい場合は...それがあなたの選択です。最近では、ユーザーはさらに奇妙な要求に応じます。
しかし、タスクの複雑さに挑戦し、価格に関係なく正規表現を使用してそれを実行したい場合は、次のようにします。
^(?:0*[1-9]0*)+$
これにより、文字列のすべての文字が数字であり、そのうちの少なくとも1つがゼロ以外であることが保証されます。さらに、文字列の長さをチェックすると、7または5に等しいかどうかがわかります(これは比較的簡単な方法です)。
難しい方法:
^\d{4}[1-9]|\d{3}[1-9]\d|\d{2}[1-9]\d{2}|\d[1-9]\d{3}|[1-9]\d{4}$
(これは5桁の郵便番号用です。7桁の郵便番号に拡張してみてください):P