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

나는 많은 줄이있는 거대한 텍스트 파일을 가지고있다. 어떤 사람이 번호 '800000000'을 추출 할 수 있도록 Regex를 빌드하는 방법을 알려주십시오.Regex to phone number

발신 번호와 발신 번호는 각각 입니다.

는 항상 현재 내가 빈 공간에 선을 분할하고 다음 나는 매우 비효율적 느낌 배열을 반복 to

에 의해 follwed 된 번호가 필요합니다.

+1

당신이 전화 번호는 시작에서 끝을 정확하게 문자를 알고 있다면 각 라인에 대해 Regex보다 더 효율적일 것입니다. – vcsjones

+0

@vcsjones : 동의 함; 모든 라인이이 라인처럼 보이면 적어도 전화 번호를 통해 고정 길이로 취급 할 수 있습니다. – KeithS

+0

nope. 이 외에도 많은 다른 행이 있습니다. 이 형식의 행에만 관심이 있습니다. – Sandeep

답변

0

시도 to '(\d{9}). 이는 텍스트 to ' 다음에 오는 연속 9 자리 숫자의 모든 순서와 일치하며 그 결과를 첫 번째 캡처 그룹에 저장합니다.

+0

그것은 from과 to의 숫자와 일치합니다. 문제는 구체적으로 to 번호 만 일치해야한다고 말합니다. –

+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

을 편집했습니다. (말하자면, 라인을 분할하는 것보다 효율적이지는 않습니다. 정규식은 효율성의 모델이 아닙니다.) – Shlomo

+1

정말 첫 번째 및 세 번째 캡처 그룹이 필요하지 않습니다. '^ sch

+0

감사합니다. 해당 업데이트로 편집되었습니다. – Shlomo

0

간단하게 보인다. 파일에서 "샘플"라인을 가져 와서 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> 규칙을 사용하여 이름을 지정하기 만하면됩니다. 이 경기에서 그룹을 가야 그 후

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

:

0

먼저 당신은에-번호의 전체 일치를 얻을 수 있습니다. 당신은 더 나은 다음과 같이 명명 된 그룹을 :

, 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; 
}