簡體   English   中英

C#正則表達式電話號碼檢查

[英]C# Regex Phone Number Check

我有以下內容來檢查電話號碼是否采用以下格式(XXX)XXX-XXXX。 以下代碼始終返回true。 不知道為什么。

   Match match = Regex.Match(input, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}");

    // Below code always return true
    if (match.Success) { ....}

關於電話號碼的正則表達式模式的一般抱怨是,他們需要一個人將真正的可選字符作為破折號和其他項目。

為什么它們不是可選的,並且如果它們存在或不存在則不關心模式?

下面的模式為用戶提供了破折號,句點和括號可選,並使用命名捕獲作為結果關注數字。

模式被注釋(使用#並跨越多行),因此使用正則表達式選項IgnorePatternWhitespace除非刪除注釋。 因為該標志不影響正則表達式處理,它只允許通過#字符和換行符對模式進行注釋。

string pattern = @"
^                  # From Beginning of line
(?:\(?)            # Match but don't capture optional (
(?<AreaCode>\d{3}) # 3 digit area code
(?:[\).\s]?)       # Optional ) or . or space
(?<Prefix>\d{3})   # Prefix
(?:[-\.\s]?)       # optional - or . or space
(?<Suffix>\d{4})   # Suffix
(?!\d)             # Fail if eleventh number found";

上述圖案只是看起來為10個數字,並忽略任何填料字符,例如一個(或破折號-或空格或標簽或者甚至. 。實例是

(555)555-5555 (OK)
5555555555 (ok)
555 555 5555(ok)
555.555.5555 (ok)
55555555556 (not ok - match failure - too many digits)
123.456.789 (failure)

相同模式的不同變體

沒有注釋的模式不再需要使用IgnorePatternWhiteSpace

^(?:\(?)(?<AreaCode>\d{3})(?:[\).\s]?)(?<Prefix>\d{3})(?:[-\.\s]?)(?<Suffix>\d{4})(?!\d)

不使用命名捕獲時的模式

^(?:\(?)(\d{3})(?:[\).\s]?)(\d{3})(?:[-\.\s]?)(\d{4})(?!\d)

如果使用ExplicitCapture選項,則為Pattern

^\(?(?<AreaCode>\d{3})[\).\s]?(?<Prefix>\d{3})[-\.\s](?<Suffix>\d{4})(?!\d)

它並不總是匹配,但它將匹配包含三個數字的任何字符串,后跟一個連字符,后跟四個以上的數字。 它也會匹配,如果有一些看起來像前面的區號。 所以根據你的正則表達式這是有效的:

%%%%%%%%%%%%%%(999)123-4567%%%%%%%%%%%%%%%%%

要驗證字符串是否包含電話號碼而不是其他內容 ,您需要在正則表達式的開頭和結尾添加錨點

@"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$"

Alan Moore很好地解釋了你的exp實際上在做什么。 +1

如果你想完全匹配“(XXX)XXX-XXXX”而絕對沒有別的,那么你想要的是什么

@"^\(\d{3}\) \d{3}-\d{4}$"

這是我使用的C#代碼。 它旨在從一頁文本中獲取所有電話號碼。 它適用於以下模式:0123456789,012-345-6789,(012)-345-6789,(012)3456789 012 3456789,012 345 6789,012 345-6789,(012)345-6789,012.345.6789

List<string> phoneList = new List<string>();
Regex rg = new Regex(@"\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})");
MatchCollection m = rg.Matches(html);
foreach (Match g in m)
{
    if (g.Groups[0].Value.Length > 0)
        phoneList.Add(g.Groups[0].Value);
}

上述評論中沒有一條能夠處理國際號碼,例如+33 6 87 17 00 11(例如法國的有效電話號碼)。 我會采用兩步法進行:1。刪除所有不是數字或'+'字符的字符2.檢查+符號是否在開頭或不在那里。 檢查長度(這可能非常困難,因為它取決於當地的國家/地區編號方案)。 現在,如果您的號碼以+1開頭,或者您確定該用戶位於美國,那么您可以應用上述評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM