【问题标题】:regex stop at the beginning of next match in multiline text正则表达式在多行文本中的下一个匹配开始处停止
【发布时间】:2019-09-22 02:09:25
【问题描述】:
ID_FIRST
在每个 id 之后出现一个或多个
文字多样的线条
ID_SECOND
模式重复多次
ID_THIRD
到此结束,但可能会更大
我只想提取每个 ID_* 及其下面的文本,直到下一个 ID_。
看起来很简单
(ID_.+)([\s\S]+)
我尝试了几种贪婪和标志的组合,但它要么捕获所有文本直到结束,要么在 ID_ 处停止。我想我错过了一些基本的东西
https://regex101.com/r/Ruy44M/1
【问题讨论】:
标签:
javascript
regex
multiline
【解决方案1】:
[\s\S] 也匹配换行符,因此 [\s\S]+ 将匹配到结尾。您可以在第 1 组中捕获匹配 ID_ 后跟 1+ 个字符。
然后使用匹配换行符的重复模式在第 2 组中捕获,然后使用负前瞻(?! 首先检查该行是否以 ID_ 开头:
(ID_.+)((?:\n(?!ID_).*)*)
说明
-
(ID_.+) 捕获组 1 - 匹配 ID_,然后匹配除换行符以外的任何字符 1 次以上
-
(捕获组2
-
(?:非捕获组
-
\n(?!ID_).* 匹配换行符并断言右边的内容不是 ID_。如果是这种情况,则匹配除换行符以外的任何字符 0+ 次
-
)*关闭非捕获组并重复0+次
-
)关闭捕获组
Regex demo
例如:
const regex = /(ID_.+)((?:\n(?!ID_).*)*)/gm;
const str = `ID_FIRST
After each id come one or more
lines with diverse text
ID_SECOND
The pattern repeats many times
ID_THIRD
That's the end but could be larger`;
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log("ID: " + m[1]);
console.log("Text: " + m[2]);
}