-6

文字列に SSN や電話番号を含めないでください。以下の正規表現は機能しません。xxxxxxxxx 形式のみを受け入れます。

xxx-xx-xxxxまたはxxx-xxx-xxxまたはを含めないでxxxxxxxxxください。

regex = "^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$";

4

1 に答える 1

4

あなたは試すことができます:

^(?!((\\d{9})|(\\d{3}-\\d{2}-\\d{4})|(\\d{3}-\\d{3}-\\d{3}))$).*

説明するために、あなたが提供したクエリを読んだ場合:

^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$

私たちはそれを読むことができました: is not followed by xxxxxxxxx OR is not followed by xxx-xx-xxxx OR is not followed by xxx-xxx-xxx(上の私のバージョンでは、これを次のように言い換えました: is not (xxxxxxxxx OR xxx-xx-xxxx OR xxx-xxx-xxx).)。

世界中のどの文字列も、そのうちの少なくとも 2 つには一致しないことが保証されているため、それらの組み合わせは常に真であり、はるかに単純で効果的な正規表現が得られます。

^$

?!ゼロ幅のアサーションであるため、何も消費しません。先読みによってチェックされたものと一致する場合でも、入力を消費していないため、先読みの外で必要な $ に到達することはありません。.*最終的な$修正の前にa を追加するだけです。

ハイフンの後に ? を付けるべきではないと思います。それらをオプションにすることは、 と も一致させることを意味しxxx-xxxxxxますxxx-xx-x-xxx。それが意図されている場合は、それらを元に戻すか、正規表現を大幅に簡素化して、次のようにすることができます。

^(?!\\d{3}-?\\d{2}-?\\d-?\\d{3}$).*

他の問題\\d[9]$\\d{9}$

于 2012-12-31T17:38:00.267 に答える