2013-02-22 1 views
1

텍스트를 파싱하고 있는데 시간이 만나는 경우 문자열을 분할하고 싶습니다. 다음은 예입니다왜이 C# 코드에서 문자열의 일부가 분리됩니다.

At 12:30AM I got up. At 11:30PM I went to bed. 

내 코드 :

At 12:30AM 
I got up. At 11:30PM 
I went to bed. 

내가 무엇을 얻을 : 내가 할 필요가있는 무엇

string time = @"[0-9]{2}:[0-9]{2}(A|P)M"; 
string test = "At 12:30AM I got up. At 11:30PM I went to bed."; 
string[] result = Regex.Split(test, time); 

foreach(string element in result) 
{ 
    Console.WriteLine(element); 
} 

At 
A 
    I got up. At 
P 
    I went to bed. 

모든 것을시간의 남은 시간은 A 또는 P입니다.

답변

1

변경 주위

([0-9]{2}:[0-9]{2}[AP]M) 

Thhe 브래킷에 정규식 (A | P)는 캡처 그룹으로 정의된다. 캡처 할 전체 문자열이 필요합니다. 그래서 모든 것을 괄호로 묶으십시오.

+0

'[A | P]'가'A','|','P'와 일치하지 않습니까? – Mehrdad

+0

'|'는 특수 문자입니다. 따라서 이스케이프 문자가 없으면 일치하지 않습니다. – Aditi

+0

아니요, @Mehrdad가 맞습니다 :'[AP]'이어야합니다 –

1

분할 기능 구분 기호가 결과에 포함되어 있지 않기 때문에. 당신이 분할 요소로 유지하려면
는 그들이 괄호 안에 되었기 때문에 'A'와 'P'가, 왼쪽되었다는 이유, 그런데 괄호

string time = @"([0-9]{2}:[0-9]{2}(A|P)M)"; 

로 묶습니다.

+0

실제로; A 또는 P를 독자적으로 캡처하고 싶지 않으면 [AP] 또는 (? : A | P)를 사용하고 싶습니다. – Joe

0

캡처 그룹을 사용하십시오.

string [email protected]".+?(?:\b\d{2}:\d{2}(?:AM|PM)|$)"; 
MatchCollection matches=Regex.Matches(input,regex); 
foreach(var match in matches) 
    Console.WriteLine(match.Groups[0]); 
+0

-1. 게시하기 전에 솔루션을 실제로 테스트해야합니다. 정규식의 모든 슬래시는 백 슬래시로,'MatchesCollection' 클래스 이름은'MatchCollection'이어야하며'Match' 대신'Matches' 메소드를 호출해야합니다. 그리고 모든 것을 고쳤을 때, 그것은 여전히 ​​OP가 원하는 것을하지 않을 것입니다. –

+0

당신은 수정 프로그램에 대해 옳았 습니다만, 최종 요구 사항은 묻기를 원하거나 적어도 그가 작성한 것을 수행합니다. 그는 자신의 모범에서 보이는 것처럼 패턴 앞에 단어를 포함시키고 자합니다. – RoadBump

+0

'성의 없습니다. 세미콜론을 첫 줄에서 벗어나서'Matches() '에 대한 인수를 반대로했습니다. 따라서 답변을 올리면서 자신감이 있어도 항상 게시 전에 테스트해야합니다. 하지만 당신의 정규식은 여전히 ​​옳지 않습니다. ** ** ** ** (http://ideone.com/zN47KG)를 볼 수 있습니다. 어쩌면 당신은 [** this **] (http://ideone.com/shiPH2)를 생각하고 있을까요? –

관련 문제