1

私は現在この正規表現を使用しています

"/^([0-9\(\)\/\+ \-]*)$/",

これは問題ありませんが、問題は「空白」の入力とスペースのみを受け入れることであり、検証を台無しにします。どの正規表現コードを使用すると、このタイプの入力のみを使用から検証できます。

(999) 999-9999

また、入力時にユーザーからの「空白」の入力フィールドを受け入れません。私が上で述べたこの入力のみを受け入れる限り、どんな長さでも構いません。

失敗した試みの外側:

^\(\d{3}\)\s{0,1}\d{3}-\d{4}$
/^\(\d{3,4}\) \d{3}-\d{1,10}$/

これは、この形式の正規表現を作成する上で失敗した他の試みです。どちらも受け入れません

(999) 999-9999
4

7 に答える 7

2

どの言語でこれを行っているかを述べていないため、正規表現パーサーにどのような制限が課せられているかわかりません。たとえば、traditionalsedは BRE に限定され、awk と grep は ERE を処理でき、Linux システムの grep は PCRE を処理します。Perl はもちろん、Python や PHP と同様に PCRE も行います。しかし、JavaScript は BRE のサブセットしかサポートしておらず、POSIX クラスの古典的なショートカットの一部が欠けています。

だから...すべてがサポートするBREでこれを行うには、ブラケットは文字通り取られ、範囲制御は制限されます:

^([[:digit:]]\{3\})[[:space:]]\{0,1\}[[:digit:]]\{3\}-[[:digit:]]\{4\}$

しかし、これは大変で苦痛です。少なくとも ERE をサポートするものを使用している可能性があります。

^\([[:digit:]]{3}\)[[:space:]]?[[:digit:]]{3}-[[:digit:]]{4}$

また、パーサーがクラスの短縮形をサポートしている場合は、これをさらに短縮できます。

^\(\d{3}\)\s?\d{3}-\d{4}

この最後のものは、perl または PHP の PCRE サポートで使用できますが、sed、awk、または grep では使用できません。

また、これは入力の検証を処理する良い方法ではないことも指摘しておきます。もっと柔軟性が欲しい。たとえば、次のようにすることをお勧めします。

  1. 数字以外の文字をすべて取り除く
  2. 結果が 10 桁の場合は、有効な市外局番を確認します
  3. 結果が 11 桁で最初の桁が 1 の場合、有効な市外局番を確認します
  4. それ以外の場合は、これを国際番号と見なします

おそらく、他の条件もいくつか考え出す必要があります。

于 2012-10-15T23:05:14.147 に答える
1

入力の検証とデータ抽出を混同しないでください。

一般に、住所や電話番号などに正確な形式を強制することは無駄です。まず第一に、人間 (データを入力する人) にコンピューターの仕事 (データのフォーマット) を任せます。有効なデータを入力できないことは、いくつかの入力ミスよりもはるかに悪いことだと思います。たとえば、国の接頭辞を使用するものはすべて拒否しています。

したがって、単純な検証では、入力に数字があるかどうかを確認するだけで、それ以上は何もしません。@メールアドレスを検証するために探すのと同じように。正規表現を正しくするために何日も費やしますが、最終的にはそれが問題ではないことに気付くだけです。

于 2012-10-15T12:06:14.937 に答える
1

括弧をエスケープするのを忘れました。これを試して:^\(\d{3}\)\s{0,1}\d{3}-\d{4}$

于 2012-10-15T11:59:05.107 に答える
1

これは私にとってはうまくいきました。正規表現テスターでテスト済み。

\([1-9][0-9]{2}\)[ ][1-9]{3}[-][0-9]{4}

これは完全一致 (999) 999-9999 形式になります。

コード内で必要に応じて「\」をエスケープします。

于 2013-10-08T21:21:12.060 に答える
0

空白を避けるためにの+代わりに使用してください。*「スペースのみ」を回避するために、次のようなことを試すことができます。

"/^([ ]*[0-9\(\)\/\+\-]+[ ]*)*$/"
于 2012-10-15T11:57:23.670 に答える
-2

JavaScript では、以下を使用します。

function validatePhoneNumber(number) { 
    var re = /^\(\d{3}\)\s{0,1}\d{3}-\d{4}$/;
    return re.test(number);
} 

PHP の場合:

<?php
if (preg_match("/^\(\d{3}\)\s{0,1}\d{3}-\d{4}$/", $number)) {
    //phone number is valid code
}
?>
于 2012-10-15T16:54:37.753 に答える
-2

解決策を思いついた、誰もが提案していた正規表現は「(」と「)」を受け入れません

だから私はこれをやった

"/^\.{1}\[0-9]{3}\.{2}\[0-9]{3}\-\[0-9]{4}$/",

(999) 999-9999 入力の "(" と ")" を受け入れることができるように

この入力のみが必要な理由は、自動マスキング用のスクリプトがあり、ユーザーからのすべての入力がこの形式に変換されるためです。そのため、正規表現検証からその特定の形式が必要でした。

于 2012-10-15T18:41:17.920 に答える