我有以下字符串:
<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。在第一条消息中没有收件人
请帮助纠正我的模式。
答案 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。你好;)