2017-02-01 2 views
-4

Я хочу сделать регулярное выражение для 10-значный номер мобильного телефона с телефонными номерами. Пример являютсярегулярное выражение для 10-значного мобильного номера с телефонными номерами

9088534816 
+91 33 40653155 
033-2647-0969 

Я хочу сделать регулярное выражение, который может соответствовать все три формата, как

xxxxxxxxxx 
+xx xx xxxxxxxx 
xxx-xxxx-xxxx 

форматов. Кто-нибудь может мне помочь? Я попытался с этим

\+?\d[\d -]{8,12}\d 

но также принимая этот номер 12115351689385. Это моя проблема

+1

Ваши первые попытки? –

+0

Да, это мой \ +? \ D [\ d -] {8,12} \ d –

+3

Дизайн и тестирование каждого шаблона * отдельно *: '^ [0-9] {10} $', '^ \ + [0-9] {2} \ s + [0-9] {2} \ s + [0-9] {8} $ 'и т. Д. Затем * объединить * их:'^([0-9] {10}) | (\ + [0-9] {2} \ s + [0-9] {2} \ s + [0-9] {8}) | ... | (...) $ ' –

ответ

2

Дизайн и тестирование каждого рисунка sep artely:

Format   Pattern 
------------------------------------------------- 
    xxxxxxxxxx  ^[0-9]{10}$ 
+xx xx xxxxxxxx ^\+[0-9]{2}\s+[0-9]{2}\s+[0-9]{8}$ 
    xxx-xxxx-xxxx ^[0-9]{3}-[0-9]{4}-[0-9]{4}$ 
.... 

затем объединить их в окончательный один:

(pattern1)|(pattern2)|...|(patternN) 

Для трех моделей выше комбинированного шаблон

(^[0-9]{10}$)|(^\+[0-9]{2}\s+[0-9]{2}[0-9]{8}$)|(^[0-9]{3}-[0-9]{4}-[0-9]{4}$) 

вы можете реализовать что-то вроде этого:

//TODO: you may want to load the patterns supported from resource, file, settings etc. 
private static string[] m_Patterns = new string[] { 
    @"^[0-9]{10}$", 
    @"^\+[0-9]{2}\s+[0-9]{2}[0-9]{8}$", 
    @"^[0-9]{3}-[0-9]{4}-[0-9]{4}$", 
}; 

private static string MakeCombinedPattern() { 
    return string.Join("|", m_Patterns 
    .Select(item => "(" + item + ")")); 
} 

Тесты:

string[] tests = new string[] { 
    "9088534816", 
    "+91 33 40653155", 
    "033-2647-0969", 
    "123", 
    "12115351689385", 
}; 

var result = string 
    .Join(Environment.NewLine, tests 
    .Select(test => 
    $"{test,18} {(Regex.IsMatch(test, MakeCombinedPattern()) ? "yes" : "no"),3}")); 

Console.Write(result); 

Результат:

 9088534816 yes 
    +91 33 40653155 yes 
    033-2647-0969 yes 
       123 no 
    12115351689385 no 
+0

он не принимает простые 10-значные мобильные номера, такие как 9088534816 –

+0

он принимает, как +91 9632226066, работает отлично, но 9088534816 не принимает –

+0

, может быть, у вас есть место в строке? Он должен работать иначе. –

1

Упростить строку ввода первой (для упрощения RegEx шаблон)

phones = phones.Replace(" ", "").Replace("-",""); 

А теперь просто найти номера ...

var m = Regex.Matches(a, @"\+?[0-9]{10}"); 
0

Первый и третий формат (и на самом деле большинство из наиболее распространенных форматов номеров телефонов в США) могут быть объединены в одну Regex схеме:

^[(]?\d{3}[)]?[- ]?\d{3}[- ]?\d{4}$ 

Второй формат более сложный, так как это международный телефонный номер. В разных странах существуют разные форматы чисел, поэтому для анализа достаточно просто проанализировать. Если вы хотите добавить поддержку для определенной страны, например, в вашем примере, вы также можете написать шаблон для нее. Ваш конкретный пример будет:

^\+\d{2} \d{2} \d{8}$ 

(я не могу оптимизировать его для нескольких конвенций, как я сделал первый рисунок, потому что я не знаком с этим форматом номер телефона я не знаю, если это позволяет. для тире или пробелов или дополнительных или любых других культурных различий.)

После того, как у вас есть все шаблоны, которые вы хотите, вы можете комбинировать их так, как предлагает ответ Дмитрия с String.Join, а затем использовать результат в качестве шаблона для Regex.Match/Regex.Matches звонок.

Смежные вопросы