2011-01-14 3 views
0

je la chaîne suivante:S'il vous plaît aider à clarifier mon modèle regex

<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. les messages sont séparés par < <

Je dois extraire du message que les parties suivantes: 1.
temps
2. Sender
3. Destinataire
4. Texte

bénéficiaire peut être défini ou non , Ce champ est facultatif.

Je le fais par le schéma suivant:
(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/>(?<messageData>(?<sender>.+?)\*>(.+?)))<<

Mais, je ne peux pas extraire destinataire séparément du texte du message.
(?<message>(?<time>\d{1,2}:\d{1,2}:[0-9a-z]+)/>(?<messageData>(?<sender>.+?)\*>(((?<recipient>.+?):){0,1}(?<messageText>.+?))))<<

N.B. Dans le premier message pas de destinataire

Veuillez aider à corriger mon modèle.

+0

Qui est le destinataire du premier message? L'expéditeur est 'sender1', mais le destinataire semble être manquant. – misha

+0

Dans le premier message, aucun destinataire –

Répondre

1

Le modèle de groupe <recipient> doit exclure < et : ou bien il correspondra le texte entre *> et le premier colon de l'horodatage lorsque le destinataire est omis (comme dans le premier message de votre exemple).

Un tweak simple à ce modèle de groupe doit fixer:

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

note I remplacé {0,1} avec option quantificateurs (?). C'est juste un raccourci pour améliorer la lisibilité (un peu va un long chemin). :-)

En parlant de lisibilité, ici il est sous forme de plusieurs lignes:

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

Je ne sais pas si le groupe sans nom et contenant <recipient><messageText> était intentionnel, mais il est inutile. Vous pouvez le casser à ceci:

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

Check this out, peut s'adapter peu mieux:

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

post-scriptum Salut à tous;)

Questions connexes