2011-01-14 4 views
0

I 다음 문자열이 있습니다내 정규식 패턴을 명확하게 도와주세요

<script>m('02:29:1467301/>Sender1*>some text message?<<02:29:13625N1/>Sender2*>Recipient2: another message??<>A<<02:29:1393100=>User1*|0User2*|%></B><<','');</script>

N.B.을 메시지는 내가 다음과 같은 부분 메시지에서 추출 할 필요가 < <

로 구분됩니다 :
1 시간
2. 보낸 사람
3. 수신자
4. 텍스트

받는 정의 여부 될 수 있습니다 이 필드는 선택 사항입니다. 나는 메시지 텍스트와 별도로받는 사람을 추출 할 수 없습니다,
(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/>(?<messageData>(?<sender>.+?)\*>(.+?)))<<

을하지만 :

나는 다음과 같은 패턴으로이 작업을 수행.
(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/>(?<messageData>(?<sender>.+?)\*>(((?<recipient>.+?):){0,1}(?<messageText>.+?))))<<

N.B. 첫 번째 메시지에서 수신자 없음

제 패턴을 수정하는 데 도움이됩니다.

+0

첫 번째 메시지를받는 사람은 누구입니까? 보낸 사람은'sender1'이지만받는 사람은 누락 된 것으로 보입니다. – misha

+0

첫 번째 메시지에서받는 사람 없음 –

답변

1

<recipient> 그룹 패턴은 <:를 제외 할 필요가 그렇지 않으면받는 사람이 (당신의 예제의 첫 번째 메시지에서와 같이) 생략되는 경우가 *> 및 타임 스탬프의 첫 번째 콜론 사이의 텍스트를 일치합니다.

해당 그룹의 패턴에 대한 간단한 비틀기는 문제를 해결해야합니다

(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/>(?<messageData>(?<sender>.+?)\*>(((?<recipient>[^<:]+):)?(?<messageText>.+?))))<< 

주 내가 선택 한정사 (?)로 {0,1}를 교체했다. 약간의 가독성을 향상시키는 것만으로도 충분합니다. :-)

가독성의 말하기, 여기가 멀티 라인 형태 :

(?<message> 
    (?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/> 
    (?<messageData> 
     (?<sender>.+?)\*> 
     (
      ((?<recipient>[^<:]+):)? 
      (?<messageText>.+?) 
     ) 
    ) 
)<< 

익명의 그룹이 <recipient><messageText>가 의도적 포함하는 경우 나도 몰라,하지만이 필요합니다. 이로 분해 할 수

(?<message> 
    (?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/> 
    (?<messageData> 
     (?<sender>.+?)\*> 
     ((?<recipient>[^<:]+):)? 
     (?<messageText>.+?) 
    ) 
)<< 
0

확인이를, 조금 더 적합 할 수 있습니다

(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]*).+?>(?<messageData>(?<sender>.*?)>(((?<recipient>[^<:]+):)?(?<messageText>.*?))))<< 

P.S.을 안녕하세요;)

관련 문제