如何使用正则表达式获取部分?

时间:2016-12-27 01:12:24

标签: javascript regex node.js

我想用正则表达式抓住代码中的各个部分。我想写四个不同的正则表达式。第一个很简单,就是抓住以extends开头的第一行。接下来的三个需要抓取标记为block headblock bodyblock scripts的部分。

我有点失落。到目前为止,我已经/^block/m

我不打算尊重缩进,只是将它用于我自己的视觉组织。

extends standard

block head

  <title>title</title>
  <meta name="description" content="A wonderful thing.">

block body

  <h1>Title</h1>
  <p>A wonderful paragraph...</p>

block scripts

  <script src="/javascritps/html5shiv.js"></script>

我需要能够在单词块之后获取标识符。

另外,我需要在每个块____语句后抓取HTML内容。

1 个答案:

答案 0 :(得分:4)

你有一个良好的开端:以下是使用lookbehind的方法:/(?<=^block )\w+\n/mg

在此处查看此行动:https://regex101.com/r/bFhNSO/1

[EDIT]进行解释。

使用lookbehind是一种更复杂的语法,但只允许您捕获所需的单词,而不需要单词&#34; Block&#34;。

如果你不在乎,或者如果你在JS上做,你也可以这样做:

/^block (\w+)\n/mg然后你需要捕获。

[编辑]问题更改后。

因此,对于没有lookbehind的JS并且在一个正则表达式中同时抓取html,你可以使用这样的东西:/block (\w+)\n+([\s\S]*?)(?=\s+\nblock|$)/g

在此处查看:https://regex101.com/r/bFhNSO/2

请注意,我在regex101中将味道更改为js。

[编辑]添加更多详情。

  • 首先,标记g用于全局,因此您可以匹配多个实例 相同的模式。
  • (\w+)基本上捕获一个单词[a-z _] +,因此您可能希望根据需要将其更改为更宽松。
  • ([\s\S]*?)捕获任何东西,所以它就像。*你通常会看到,但特别是在JS中,你没有s标志来匹配任何间距字符{{1}所以等长的等价物是.,与任何[\s\S]+和任何NOT \s匹配\s\S用于贪婪,这意味着您希望尽可能地进行最小的匹配,您可以尝试使用正则表达式而不会理解其中的差异。
  • ?是JS中允许的前瞻,以确保您之前的匹配后跟单词(?=\s+\nblock|$)或带有block的文档结尾。

那就是它,希望它能帮到人们! :)