2012-04-24 2 views
1
<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS) 

У меня есть огромный текстовый файл со многими строками. Может кто-нибудь, пожалуйста, помогите мне в том, как создать Regex, чтобы я мог извлечь номер '800000000'?Regex для извлечения номера телефона

От и до телефонных номеров будет разные.

Я всегда нужен номер, который follwed по to

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

+1

Если вы точно знаете, какой символ начинается номер телефона и заканчивается для каждой строки это, вероятно, будет более эффективным, чем Regex. – vcsjones

+0

@vcsjones: Согласен; если все строки выглядят как это, вы можете рассматривать его как фиксированную длину, по крайней мере, по номерам телефонов. – KeithS

+0

nope. Есть много других линий, кроме этого. Меня интересует только линия с этим форматом. – Sandeep

ответ

0

Пробег: to '(\d{9}). Это будет соответствовать любой последовательности из 9 цифр в строке после текста to ' и сохранить результат в первой группе захвата.

+0

Это будет соответствовать как номерам, так и номерам. В этом вопросе конкретно говорится, что нужно сопоставить только номер. –

+0

Извините, я отредактировал свой ответ – LukeGT

0

Это работает. Я не уверен, как вариант вашего ввода, хотя ...

 string s = "<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS)"; 

     Regex r = new Regex("^<CallInfo.* to '(\\d{9})'"); 
     var match = r.Match(s); 
     var number = match.Groups[1]; 
+0

(Сказав это, я не уверен, что он более эффективен, чем разделительные линии. Regex - не совсем модель эффективности) – Shlomo

+1

Вам действительно не нужны первая и третья группы захвата , вы можете просто использовать: ''^ sch

+0

Спасибо. Отредактировано с этими обновлениями. – Shlomo

0

Выглядит достаточно просто. Я бы взял строку «sample» из вашего файла и превратил ее в Regex, отметив и заменив реальные данные специальными символами, которые указывают типы данных, которые вам интересны. В частности, вы говорите, что хотите "номер телефона:

@"^<CallInfo info: from '\d{1,9}', to '(?<toNumber>\d{1,9})', forwardedFrom '.*?', display '.*?', category '.*?', tollCategory '.*?', callingNumberRestricted (?:true|false), custom '.*?', receivingComplete (?:true|false)> -- \(SUCCESS\)$" 

Запуск весь файл от этой модели, используя Regex.Match(), вы можете получить список„до“чисел с помощью следующего кода:

List<string> toNumbers = Regex.Match(contentsOfFile, pattern).Groups["toNumber"].ToList(); 

вы можете преобразование чисел в фактические числовые значения с помощью простого анализа:

List<ulong> toNumbersAsLongs = toNumbers.Select(s=>ulong.Parse(s)).ToList(); 

Если вам нужны какие-либо другие данные из этого файла, просто оберните это поле в шаблон скобкой и дайте ему имя, используя соглашение ?<captureName>.

0

Сначала вы должны получить весь матч на-номер:

, to '[0-9]{9}', 

После этого вы должны получить группу из матча. Лучше взять с именем группы, как это:

, to '(?<toNumber>[0-9]{9})', 

Реализация для получения телефона-номер-к может выглядеть следующим образом:

string regex = ", to '(?<toNumber>[0-9]{9})',"; 
string text = "<CallInfo info: from '600000000', to '800000000', forwardedFrom '', display '', category '1', tollCategory '2',callingNumberRestricted false, custom '', receivingComplete true> -- (SUCCESS)"; 
string toNumber = string.Empty; 

Match match = Regex.Match(text, regex); 
if (match.Success) 
{ 
    toNumber = match.Groups["toNumber"].Value; 
}