【问题标题】:Regex match everything between two string, spaning multiline正则表达式匹配两个字符串之间的所有内容,跨越多行
【发布时间】:2013-05-26 06:17:30
【问题描述】:

如何正则表达式匹配两个字符串之间的所有内容? 两个字符串之间的东西跨越了几行,也可以包含所有的html字符。

例如:

<p>something</p>

<!-- OPTIONAL -->

<p class="sdf"> some text</p>
<p> some other text</p>

<!-- OPTIONAL END -->

<p>The end</p>

我想去掉整个可选部分。但是贪婪的任何字符匹配都没有做我想要的..我使用的模式是

  • &lt;!-- OPTIONAL --&gt;.*&lt;!-- OPTIONAL END --&gt;
  • &lt;!-- OPTIONAL --&gt;(.*)&lt;!-- OPTIONAL END --&gt;
  • &lt;!-- OPTIONAL --&gt;(.*)\s+&lt;!-- OPTIONAL END --&gt;
  • (?=&lt;!-- OPTIONAL --&gt;)(.*)\s+&lt;!-- OPTIONAL END --&gt;

如果只给出第一部分,它们都匹配第一个可选标签,但不适合完整的行。

这是一个例子:http://regexr.com?352bk

谢谢

【问题讨论】:

  • 你不应该使用正则表达式。 stackoverflow.com/q/1732348/34397
  • 你使用什么语言?
  • @SLaks XML 解析器是否考虑了 HTML cmets?
  • @rednaw:1)是的; XML 使用相同的注释语法。 2)htmlagilitypack.codeplex.com
  • @SLaks 你将如何去掉可选部分并返回其他所有内容?

标签: regex


【解决方案1】:

选中 RegExr 中的 dotall 复选框:)

如果没有 dotall 标志(/regex/s 中的 s),点 (.) 将无法匹配回车。

您应该使用.*? 而不是.* 来惰性匹配可选内容(参见示例中的PLEASE DO NOT MATCH! 语句)。

【讨论】:

  • 啊!请问什么是dotall,它有什么作用?
  • @LocustHorde 默认情况下,正则表达式 (.) 中的通配符不匹配换行符,这意味着正则表达式在行尾停止搜索。通过启用 dotall,. 还将在其匹配中包含换行符。
【解决方案2】:

要使正则表达式不贪婪,请在* 之后使用?

<!-- OPTIONAL -->(.*?)<!-- OPTIONAL END -->

这对你有帮助吗?

另外,根据您使用的编程语言,您可以使用修饰符使您的正则表达式点 (.) 也匹配换行符。对于 PHP,你有 s (dotall) 修饰符,例如:

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

【讨论】:

  • Multiline 不是 OP 需要的,而是 dotall 的。多行将使^$ 锚匹配多行而不是单行。
  • 好,修改了我的答案
【解决方案3】:

使用您的示例,我想我找到了答案,请在您的代码中检查:

&lt;!-- OPTIONAL --&gt;[\w\W]*&lt;!-- OPTIONAL END --&gt;

希望对你有所帮助

【讨论】:

    【解决方案4】:

    启用“dotall”选项,以便 . in regex 将匹配换行符并跨多行工作。根据您对正则表达式的实现,有多种方法可以做到这一点,请查看您的实现手册。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2018-09-02
      • 2017-11-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多