0

VB.net の電話番号フィールドの正規表現バリデーターが必要です。以下の要件を参照してください。

電話番号の形式は (+)xx-(0)xxxx-xxxxxx 内線 xxxx (オプション) である必要があります 例: 私の番号は 44-7966-591739 と表示されます 画面は +44-(0)7966-591739 内線と表示されるようにフォーマットされます

提案してください。

よろしく、 ユヴ

4

3 に答える 3

2
  +44-(0)7966-591739

(0) は電話番号表示では無効です。それを除く。

+44 7966 591739 または 07966 591739 です。

RegEx パターンは、複数の点で非効率的です。

  (\d{4}|\d{3})

上記は次のように簡略化されます。

  \d{3,4}

もっと大きな問題があります:

  ^(((+44\s?\d{4}|(?0\d{4})?)\s?\d{3}\s?\d{3})|((+44\s?\d{3}|(?0\d{3})?)\s?\d{3}\s?\d{4})|((+44\s?\d{2}|(?0\d{2})?)\s?\d{4}\s?\d{4}))(\s?#(\d{4}|\d{3}))?$

先頭の +44 または先頭の 0 を一度見つけたら、なぜそれを何度も何度も検索し続けるのでしょうか?

  ^((+44\s?..|0..).....|(+44\s?..|0..).....|(+44\s?..|0..).....)

に単純化します

  ^(+44\s?|0)(.. .....|.. .....|.. .....)

ただし、上記のパターンは、UK 4+6、3+7、および 2+8 形式の数値のみに対応しており、3+6、4+5、5+5、および 5+4 形式の数値には対応していません。

パターンが不十分です。

電話番号の検証と書式設定は、個別の手順に分割する必要があります。幅広い入力形式を許可し、重要な数字を抽出してさまざまなダイヤル プレフィックスを破棄し、残りの番号を国際形式または国内形式で厳密にフォーマットします。

ロンドン番号の場合、スペースを含む正しい形式は、+44 20 3555 7890 または 020 3555 7890 または (020) 3555 7890 で、スペースを含まない場合: +442035557890 または 02035557890 です。

(0) 括弧内は決して有効ではありません。使用しないでください。

英国の電話番号は、2+8、3+7、3+6、4+6、4+5、5+5、5+4 など、さまざまな形式を使用しています。一部のユーザーは、どの形式がどの数値範囲に対応しているかを知らず、入力時に間違ったものを使用する可能性があります。彼らにそれをさせてください。あなたはDIGITSに興味があります。

ステップ 1: 入力形式が有効であることを確認する

入力が英国の電話番号のようになっていることを確認してください。さまざまなダイヤル プレフィックス、+44、011 44​​、00 44 を、括弧、ハイフン、またはスペースの有無にかかわらず受け入れます。または先頭に 0 を付けた国別形式。 ユーザーが残りの数字に必要な任意の形式を使用できるようにします。その特定の番号。アンバランスな括弧について心配する必要はありません。入力の重要な部分は、正しい桁数であることを確認することです。句読点とスペースは関係ありません。

  ^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$

上記のパターンは、オプションの開き括弧、その後に続く 00 または 011、オプションの閉じ括弧、オプションのスペースまたはハイフン、オプションの開き括弧に一致します。または、最初の開き括弧の後に、スペースやハイフンを付けずにリテラル + を続けます。前の 2 つのオプションのいずれかの後に、オプションの右括弧付きの 44、オプションのスペースまたはハイフン、オプションの括弧内のオプションの 0、オプションのスペースまたはハイフン、オプションの左括弧が続きます (国際形式)。または、パターンは、オプションの最初の開き括弧とそれに続く 0 トランク コード (国別形式) に一致します。

前の部分の後に、NDC (市外局番) と加入者の電話番号が続きます。2+8、3+7、3+6、4+6、4+5、5+5、または 5+4 形式で、またはなしでスペースおよび/またはハイフン。これには、市外局番が終わり、ローカル加入者番号が始まるとユーザーが考える場所の後に、オプションの閉じ括弧および/またはオプションのスペースまたはハイフンの規定も含まれます。このパターンにより、任意の形式を任意の GB 番号で使用できます。ユーザーが入力時にこの数値の間違った形式を使用した場合は、後のロジックで表示形式を修正する必要があります。

パターンは、オプションのスペースまたはハイフンの後に x、内線番号、およびオプションのピリオド、または # が続き、その後に内線番号の数字が続くオプションの内線番号で終わります。次のステップで括弧が削除されるため、パターン全体で括弧のバランスをチェックする必要はありません。

この時点では、番号が 01 から始まるか、07 から始まるか、それ以外から始まるかは気にしません。それが有効な市外局番かどうかは気にしません。後の手順で、これらの問題に対処します。

ステップ 2: NSN を抽出して、長さと範囲をより詳細に確認できるようにする

上記のパターンを使用して入力が GB の電話番号のように見えることを確認した後、次のステップは NSN 部分を抽出して有効性をより詳細に確認し、適用可能な番号範囲に合わせて適切な方法でフォーマットできるようにすることです。

  ^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$

上記のパターンを使用して $1 から '44' を抽出し、国際形式が使用されたことを確認します。それ以外の場合、$1 が null の場合は国内形式と見なされます。

オプションの内線番号の詳細を $3 から抽出し、後で使用できるように保存します。

$2 から NSN (スペース、ハイフン、括弧を含む) を抽出します。

ステップ 3: NSN を検証する

$2 からスペース、ハイフン、および括弧を削除し、さらに RegEx パターンを使用して長さと範囲をチェックし、数値タイプを識別します。

これらのパターンは、さまざまなダイヤル プレフィックスや国コードを処理する必要がないため、はるかに単純になります。

したがって、有効な携帯電話番号に一致するパターンは次のように単純です。

  ^7([45789]\d{2}|624)\d{6}$

プレミアム料金は

  ^9[018]\d{8}$

各番号タイプには、固定電話、ビジネス レート、非地理的、VoIP など、他にも多数のパターンがあります。

問題をいくつかのステップに分割することにより、非常に広範囲の入力形式が許可され、NSN の番号範囲と長さが非常に詳細にチェックされます。

ステップ 4: 番号を保存する

NSN が抽出されて検証されたら、番号を国コードとともに保存し、他のすべての数字はスペースや句読点を含めずに保存します (例: 442035557788)。

ステップ 5: 数値を表示用にフォーマットする

別の単純なルールのセットを使用して、必要な +44 または 0 を先頭に追加して数値をフォーマットすることができます。

03から始まる数字のルールは

  ^44(3\d{2})(\d{3])(\d{4})$

としてフォーマットされた

  0$1 $2 $3 or as +44 $1 $2 $3

02 で始まる数字は

  ^44(2\d)(\d{4})(\d{4})$ 

としてフォーマットされた

  (0$1) $2 $3 or as +44 $1 $2 $3

完全なリストはかなり長いです。すべてをコピーしてこのスレッドに貼り付けることはできますが、その情報を複数の場所に長期にわたって保持するのは困難です。現在のところ、完全なリストはhttp://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbersにあります。

于 2012-11-09T09:37:31.873 に答える
0

国際形式では、括弧内に (0) を含めないでください。

ITU E.123 はそれに対して警告しています: http://www.itu.int/rec/T-REC-E.123-200102-I/en 同様に: http://revk.www.me.uk/2009/ 09/そうではない-44-0207-123-4567.html

于 2011-02-20T11:32:10.010 に答える
0

検証のために:
ボビンスが指摘しているように、電話番号にはさまざまな入力方法があるため、柔軟に対応する必要があります。

値を検証する簡単で効果的な方法の 1 つは、最初に数値以外の値をすべて削除し、少なくとも 11 桁の長さであることを確認し、英国の数字に制限している場合は、0 または 44 で始まることを確認することです。

私は vb.net 構文を調べるのに煩わされることはありませんが、これに沿った何か:

if Phone.replaceAll('\D','').length < 11
    // Invalid Number
endif;

(\Dは 0 ~ 9 以外の正規表現です。)


要求どおりに数値をフォーマットするには、ページに表示したい比較的固定された入力があると仮定すると、次のようなものが機能する可能性があります。

交換:

(\d{2,3})\D*0?\D*(\d{4})\D*(\d{5})\D*(\d*)

と:

+$1-(0)$2-$3 ext $4

これはかなり柔軟ですが、古い電話番号は受け付けません。現在、最初に国際コードが必要であり、完全に機能するかどうかを知るためのルールについてはよくわかりませんが、必要なものには十分かもしれません.


正規表現コメント モードでのその正規表現の説明 (したがって、必要に応じて正規表現として直接使用できます):

(?x)        # enable regex comment mode (whitespace ignored, hashes start comments)

# international code:
(\d{2,3})   # matches 3 or 2 digits; captured to group 1.

# optional 0 with potental spaces dashes or parens:
\D*         # matches as many non-digits as possible, none required.
0?          # optionally match a zero
\D*         # matches as many non-digits as possible, none required.

# main part of number:
(\d{4})     # match 4 digits; captured to group 2
\D*         # matches as many non-digits as possible, none required.
(\d{5})     # match 5 digits; captured to group 3.

# optional prefix:
\D*         # matches as many non-digits as possible, none required.
(\d*)       # match as many digits as possible, none required; captured to group 4.
于 2009-11-03T00:14:58.603 に答える