0

重複の可能性:
米国の電話番号に一致する正規表現

私はhtmlで電話番号を見つける必要があります。私はこことグーグルで多くの例を見てきましたが、なぜ私がどれもうまくいかないのか分かりません。

  1. 電話番号の例のサイト 1
  2. 電話番号のサンプル サイト 2

基本的に、私はすべての米国パターンの電話番号を使用していましたが、見つけたものはすべて使用しましたが、運が悪く、このコードを使用しています:

コード: public static string Extractphone(string html) { StringBuilder sb = new StringBuilder();

    try
    {
        List<string> tmpemail = new List<string>();
        string data = html; 
        //instantiate with this pattern 
        Regex emailRegex = new Regex(@"(\\d{3})-(\\d{3})-(\\d{4})",
            RegexOptions.IgnoreCase);
        //find items that matches with our pattern
        MatchCollection emailMatches = emailRegex.Matches(data);

        foreach (Match emailMatch in emailMatches)
        {
            if (!tmpemail.Contains(emailMatch.Value.ToLower()))
            {
                sb.AppendLine(emailMatch.Value.ToLower());

                tmpemail.Add(emailMatch.Value.ToLower());
            }
          //  (541) 708-1364
        }
        //store to file
    }
    catch (Exception ex)
    {
    }
    return sb.ToString();
}

多くの例からパターンを何度も変更しましたが、うまくいきません。

4

3 に答える 3

0

「@」記号を使用してエスケープ シーケンスを無視し\\、バックスラッシュ文字をエスケープするために使用しています。

不要なバックスラッシュまたは @ 記号を削除します。正規表現は基本的な米国の電話番号に適しているように見えます。

ここを参照してください:標準 SO 回答の電話番号検証のための包括的な正規表現、およびここを参照してください: http://regexlib.com/Search.aspx?k=US%20Phone%20number良い正規表現サイトについては、まだ見ていない場合それらはまだです。

于 2012-11-10T05:02:41.383 に答える
0
  • 文字列リテラルを使用しているため'\\'、バックスラッシュをエスケープしていません。余分なスラッシュを削除するだけで、最初のケースに一致します
  • 複数のケースを処理するには、それらの複数のケースを正規表現に入れる必要があります。先頭の括弧がある可能性があるため、 を使用してそれを確認する必要があります\(?。末尾のものと同じで、それと 0+ スペースまたはダッシュがある可能性があるため、または大文字と小文字をチェックする必要があります。(\)\s*|-)
  • \d{3}または\d{4}グループは単一の一致であるため、括弧は必要ありません。それはおそらく式を読みにくく理解しにくくしているだけです

したがって、正規表現の初期化のために次のものが残ります

Regex emailRegex = new Regex(@"\(?\d{3}(\)\s*|-)\d{3}-\d{4}",
            RegexOptions.IgnoreCase);

私はこれをしっかりとテストしていませんが、うまくいくと思います。

余談ですが、正規表現は、理解していないと非常にわかりにくいものの 1 つです。式で何がチェックされているかを実際に理解していない場合、他の誰かの式をそのまま使用しようとすると、悪い結果が生じる可能性があります。また、私がそこに書いたことは包括的ではありません。この 2 つの場合にのみ役立ちます。任意の電話番号を処理できるようにするには、式がすぐに複雑になります。

于 2012-11-10T05:04:28.730 に答える
0

これを試してregex

(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}

説明:

(?:subexpression) 非キャプチャ グループを定義します。

\d 任意の 10 進数に一致します。

| 縦棒|文字で区切られた任意の 1 つの要素に一致します。

およびサンプルコード:

var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");

ただし、次のことに注意してください。

逐語的な文字列リテラルは @ で始まり、二重引用符で囲まれています。例えば:

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"

@"(\\d{3})-(\\d{3})-(\\d{4})"
rather than
@"(\\\\d{3})-(\\\\d{3})-(\\\\d{4})"

于 2012-11-10T05:05:55.657 に答える