如何在两个标签之间捕获多行正则表达式?

时间:2014-01-12 21:24:06

标签: regex

选择2个评论标签之间的所有文字的最佳方法是什么? E.g。

<!-- Text 1
     Text 2
     Text 3
-->

<\!--.*将抓取<!-- Text 1但不会抓取Text 2Text 3-->

修改 根据Basti M的回答,<\!--((?:.*\n)*)-->将选择第一个 <!--最后一个 -->之间的所有内容。即下面第1到11行。

如何修改此选项以仅选择单独标签中的行?即第1至4行:

1 <!-- Text 1 //First
2      Text 2
3      Text 3
4 -->
5
6 More text
7 
8 <!-- Text 4
9      Text 5
10     Text 6
11 -->         //Last

3 个答案:

答案 0 :(得分:10)

根据您的基础引擎,使用s - 修饰符(并在表达式的末尾添加-->
这将使.匹配换行字符。

如果您无法使用s - 标志,则可以使用

<!--((?:.*\r?\n?)*)-->

说明:

<!--         #start of comment
  (           #start of capturing group
    (?:       #start of non-capturing group
      .*\r?\n? #match every character including a line-break
    )*        #end of non-capturing group, repeated between zero and unlimited times
  )           #end of capturing group
-->           #end of comment

要匹配多个评论区块,您可以使用

/(?:<!--((?:.*?\r?\n?)*)-->)+/g

Demo @ Regex101

答案 1 :(得分:2)

使用s修饰符匹配新行。例如:

/<!--(.*)-->/s

演示:http://regex101.com/r/lH0jK9

答案 2 :(得分:1)

Regex is not the right tool to parse html or xml,使用正确的解析器,我在这里使用

$ cat file.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test>
<!-- Text 1
     Text 2
     Text 3
-->
</test>

测试:

$ xmllint --xpath '/test/comment()' file.xml
<!-- Text 1
     Text 2
     Text 3
-->

如果您解析html,请使用--html开关。