【问题标题】:regular expression not matching mutiple results, when matching against a single line与单行匹配时,正则表达式不匹配多个结果
【发布时间】:2014-02-17 19:45:33
【问题描述】:

有正则表达式的好手吗?..

我正在运行以下正则表达式:

<body>.*</body>    

关于以下文字:

<text>initial text</text>
 <comment>
   <user>
     6
   </user>
   <date>
     635277984371174139
   </date>
   <body>
     Recorded clinical data: 0132.00 Managing director dawd
   </body>
 </comment>
 <comment>
   <user>
     6
   </user>
   <date>
     635277984559612059
   </date>
   <body>
     Recorded clinical data: 0132.00 Managing director ii
   </body>
 </comment>
 <comment>
   <type>
     Completed
   </type>
   <user>
     6
   </user>
   <date>
     635277984668163579
   </date>
   <body>
     kkk
   </body>
 </comment>

但是,这只会导致一场比赛......我希望有 3 场比赛......有人知道为什么吗?

【问题讨论】:

  • 您使用什么语言?珀尔? Javascript? ? ;) 您可以编辑问题并将语言作为标签提供。它可能有助于获得确切的答案。 (请参阅我关于在您的正则表达式上使用 /g 标志的评论)
  • 您没有捕获任何内容,因此如果至少出现 1 次,它将返回它。
  • 关于捕获的要点。 @user3320546,您想在结果中包含 body 标记还是仅包含“内部 HTML”?
  • 所以,(&lt;body&gt;.*?&lt;/body&gt;)&lt;body&gt;(.*?)&lt;/body&gt;
  • 您好,感谢您的帮助。我还添加了一个 c# 标签。

标签: c# xml regex


【解决方案1】:
  1. 您不应该使用正则表达式解析 HTML(除非 HTML 的微不足道且恒定的 sn-ps),否则您将面临奇怪的错误:RegEx match open tags except XHTML self-contained tags

  2. 您的正则表达式失败,因为 * 是一个 贪婪 量词。这意味着它会尽可能地“吃”:这将从第一个 &lt;body&gt; 匹配到最后一个,包括内部的。你想要的是

    <body>.*?</body> 
    

    ? 使量词非贪婪,它将在第一个匹配时停止。

  3. 您应该编辑您的问题,因为您的 HTML 目前不可读。

【讨论】:

    【解决方案2】:

    你的表情很贪婪。 .* 将匹配所有内容直到最后,然后回溯到找到 &lt;\/body&gt; 的位置。

    你需要让你的正则表达式变得懒惰,像这样 -

    <body>.*?<\/body>
    

    证明here

    【讨论】:

    • +1 您可能还需要像这样添加全局开关:htmlString.match(/&lt;body&gt;.*?&lt;\/body&gt;/g);(这是 javascript)
    • 是的,在我添加的链接中,我使用的是全局标志(PHP),但由于没有提及任何语言,所以没有提及。
    • 转义/ 没有用,除非您将正则表达式括在正斜杠中。您可能希望在您的正则表达式中显示:/&lt;body&gt;.*?&lt;\/body&gt;/
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2015-07-06
    • 2016-02-16
    相关资源
    最近更新 更多