Достать номер из текста

148
20 октября 2019, 09:10

Дан текст, в нём есть номер телефона, может быть как мобильный, так и "домашний", определенного формата нет, длина тоже может быть разной, например могут быть варианты:

xx-xx-xx
xxx-xxx
xxx-xx-xx
8(xxx)-xxx-xx-xx
8xxxxxxxxxx

И так далее

Возникает вопрос, как их достать, думаю пользоваться regex но прописать все варианты думаю если и возможно, то их очень много

EDIT 1

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

Один из вариантов - удалить все тире и скобки и найти самую длинную цифру. Удалить не так сложно, сложнее найти самое длинное число в строке. Как это можно реализовать?

EDIT 2

Вот пример, в примере домашний номер телефона, однако может быть и мобильный, записанный в любом формате

Продолжается набор в группу "ПАРИКМАХЕР 3 разряда"!!!5 марта начинается курс обучения

Парикмахерские курсы включают в себя полную теоретическую и практическую подготовку, необходимую для трудоустройства и работы по специальности «парикмахер». Ученики парикмахерских курсов за короткое время научатся выполнять модные современные стрижки, освоят технологии завивки, укладки и окрашивания волос, смогут познакомиться с новейшими технологиями и тенденциями в области парикмахерского искусства..\nПредварительная запись Иваново, ул. Хакасская, 27\n34-40-80

EDIT 3

Указал я не все варианты, так же может использоваться +7, в скобках может быть 3, а не 4 цифры. То есть вариантов может быть огромное количество, и я пытаюсь подобрать универсальный вариант для всех. Как вариант можно сделать так

string s = "Парикмахерские курсы включают в себя полную теоретическую и практическую подготовку, необходимую для трудоустройства и работы по специальности «парикмахер». Ученики парикмахерских курсов за короткое время научатся выполнять модные современные стрижки, освоят технологии завивки, укладки и окрашивания волос, смогут познакомиться с новейшими технологиями и тенденциями в области парикмахерского искусства..\nПредварительная запись Иваново, ул. Хакасская, 27 34-40-80"
s.Replace("-", String.Empty);
s.Replace("(", String.Empty);
s.Replace(")", String.Empty);

Тогда получится в тексте будет номер без лишних знаков, минимальная длинна 4 символа, как его найти?

Answer 1

приведенные вами форматы телефона

    string input = "tel 1 11-22-33 tel 2 444-555 tel 3 666-77-88 55 8(999)-111-22-33 55 81234567891";
    string pattern = "[+()0-9-]{5,20}";
    var matches = Regex.Matches(input, pattern);
    foreach (Match match in matches)
        Console.WriteLine(match.Value);
    Console.WriteLine();

Вывод:

11-22-33
444-555
666-77-88
8(999)-111-22-33
81234567891

При этом шаблоне var pattern = @"\b(\d.?){6,}\b"; У меня получился вывод:

1 11-22-33
2 444-555 
3 666-77-88
55 8(999
111-22-33 55
81234567891
Answer 2

Просто удалите все не-цифры из строки:

string source = "123(3312)+312";
string number =  new string(source.ToCharArray().Where(Char.IsDigit).ToArray());
Answer 3

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

var input = "Вася, 25 лет, 8(555)555555, образование 3 класса, желаемая зарплата 300 тыщ";
var pattern = @"\b(\d.?){6,}\b";
var matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
    Console.WriteLine(match.Value);

Вывод:

8(555)555555

Возможно, проверять границы слова не нужно, тогда можно убрать \b.

В шаблоне @"(\d.?){6,}" из-за наличия точки . ловится любой символ между цифрами. Можно улучшить вероятность нахождения нужной информации, использовав набор нужных символов:

@"(\d[()-]?){6,}"

или, если в номере телефона могут идти более одного нецифрового символа подряд, например, 8(999)-111-22-33, тогда:

@"(\d[()-]{0,2}){6,}"
READ ALSO
Как правильно подключить SQL Server к Visual Studio?

Как правильно подключить SQL Server к Visual Studio?

Я только только начал изучать C# с ASPnet фреймворк

152
Как проверить что в тексте ровно 4 цифры?

Как проверить что в тексте ровно 4 цифры?

Wrong output for "1234\n" Expected: False But was: True

143
Как преобразовать IEnumerable<JToken> в Linq.JToken

Как преобразовать IEnumerable<JToken> в Linq.JToken

У меня есть JObjectПосле выборки не могу преобразовать в JToken

113
Как передать context в класс ASP.NET MVC CORE

Как передать context в класс ASP.NET MVC CORE

Не могу разобраться, как все таки правильно, с контроллера передавать данные из БД в класс или все таки в классе получать доступ к БД? Например:...

162