【问题标题】:Regular expression for multiple lines in a web service response [duplicate]Web服务响应中多行的正则表达式[重复]
【发布时间】:2026-01-14 17:30:01
【问题描述】:

我想使用正则表达式捕获作为 web 服务调用的一部分收到的部分响应。这是我收到的回复,我有兴趣捕获 ContactMessageTransport 队列的状态。

正在发送队列的状态:

<pogo:Status>Started</pogo:Status> 

和队列名在行:

<pogo:Name>ContactMessageTransport</pogo:Name>

我使用了&lt;pogo:Name&gt;ContactMessageTransport[\w\W]*Started&lt;\/pogo:Status&gt;,它也获取了我不感兴趣的其他队列的状态。我发现很难匹配几行。你能帮忙吗?


 <getAllMessageQueueInfoResponse xmlns="http:abcd.com/MessageQueueAnalyticsAPI">
     <return>
        <Entry xmlns:pogo="http://example.com/com/integration/services/messagequeueanalyticsservice">
           <pogo:AckCount>0</pogo:AckCount>
           <pogo:DestinationID>0</pogo:DestinationID>
           <pogo:ErrorCount>25</pogo:ErrorCount>
           <pogo:ID>67</pogo:ID>
           <pogo:Latest>2017-11-28T00:00:00-05:00</pogo:Latest>
           <pogo:Name>ContactMessageTransport</pogo:Name>
           <pogo:NotAckCount>0</pogo:NotAckCount>
           <pogo:Oldest>2017-11-28T00:00:00-05:00</pogo:Oldest>
           <pogo:RetryableErrorCount>31</pogo:RetryableErrorCount>
           <pogo:SkippedCount>0</pogo:SkippedCount>
           <pogo:Status>Started</pogo:Status>
           <pogo:UnsentCount>212</pogo:UnsentCount>
        </Entry>
        <Entry xmlns:pogo="http://example.com/com/integration/services/messagequeueanalyticsservice">
           <pogo:AckCount>0</pogo:AckCount>
           <pogo:DestinationID>0</pogo:DestinationID>
           <pogo:ErrorCount>0</pogo:ErrorCount>
           <pogo:ID>65</pogo:ID>
           <pogo:Latest>2018-03-17T00:00:00-04:00</pogo:Latest>
           <pogo:Name>Email</pogo:Name>
           <pogo:NotAckCount>0</pogo:NotAckCount>
           <pogo:Oldest>2018-03-17T00:00:00-04:00</pogo:Oldest>
           <pogo:RetryableErrorCount>4</pogo:RetryableErrorCount>
           <pogo:SkippedCount>0</pogo:SkippedCount>
           <pogo:Status>Started</pogo:Status>
           <pogo:UnsentCount>0</pogo:UnsentCount>
        </Entry>

【问题讨论】:

  • 您最好使用 XML 解析器然后尝试对其进行正则表达式。话虽如此,如果您必须使用正则表达式,那么您在这里使用的是什么其他语言,python?
  • 正则表达式是我唯一的选择。它的java
  • 我可以帮助使用正则表达式,并且可以在 python 中获得一个简单的示例来处理文本,但我对 Java 不太了解。如果这有帮助,请告诉我,我会写一个答案。
  • 谢谢狙击手。感谢您的帮助

标签: regex


【解决方案1】:

您是否可能缺少一个简单的 ? 惰性令牌?它可以用在量词上,只匹配最短的可能序列。

ContactMessageTransport[\w\W]*?Started&lt;\/pogo:Status&gt;

编辑:假设总是有 8 行要匹配:

ContactMessageTransport([^\r\n]*[\r\n]){8}

编辑 2:

ContactMessageTransport[\s\S]*?Started(?:[^\r\n]*[\r\n]){3}

  • [\s\S]*? 匹配任何字符,直到 Started
  • (?:[^\r\n]*[\r\n]){3} 匹配 Started 之后的 3 行。添加的?: 仅用于防止括号创建组,这不是必需的。 (称为“非捕获组”)

【讨论】:

  • 不错。这似乎起到了作用。我想进一步加强这一点。如果我必须限制正则表达式来检查单词 Started 之后的下两行?我正在尝试查看是否可以从包含队列行和直到 的名称中进行匹配。这样我就可以完全验证一个队列的响应。
  • 只需将&lt;\/pogo:Status&gt; 部分替换为&lt;\/Entry&gt;
  • 谢谢尼古拉斯。抱歉不清楚。我想使用另一种方法使用多行检查来实现相同的结果,例如 *.com/questions/37687883/… 使用 { 和 } 字符。
  • 看看我的编辑是否有效。
  • 再次感谢。这按预期工作。据我了解,我在问这个问题。 \r 匹配回车符,\n 匹配换行符或换行符,是 ^ 用于多行匹配吗?我假设数字 8 表示正则表达式要考虑的行。你的任何提示都会帮助我理解。再次感谢您。