请帮助澄清我的正则表达式模式

时间:2011-01-14 02:42:18

标签: 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。消息由&lt;&lt;

分隔

我需要从消息中提取以下部分:
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。在第一条消息中没有收件人

请帮助纠正我的模式。

2 个答案:

答案 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>.+?)
    )
)<<

答案 1 :(得分:0)

检查一下,可能会更好一点:

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

P.S。你好;)