我想用正则表达式抓住代码中的各个部分。我想写四个不同的正则表达式。第一个很简单,就是抓住以extends
开头的第一行。接下来的三个需要抓取标记为block head
,block body
和block 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内容。
答案 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
的文档结尾。那就是它,希望它能帮到人们! :)