javascript - 正则表达式在多行文本中的下一个匹配开始处停止
问题描述
ID_FIRST
在每个 id 之后出现一行或多
行不同的文本ID_SECOND
图案重复多次
ID_THIRD
这就是结束,但可能更大
我只想提取每个 ID_* 及其下面的文本,直到下一个 ID_。
看起来很容易
(ID_.+)([\s\S]+)
我已经尝试了几种贪婪和标志的组合,但它要么捕获所有文本直到结束,要么在 ID_ 处停止。我想我错过了一些基本的东西
解决方案
[\s\S]
也匹配换行符,因此将[\s\S]+
匹配到最后。您可以在第 1 组匹配中捕获ID_
后跟 1+ 个字符。
然后使用匹配换行符的重复模式在第 2 组中捕获,然后使用负前瞻(?!
,首先检查该行是否以 ID_ 开头:
(ID_.+)((?:\n(?!ID_).*)*)
解释
(ID_.+)
捕获组 1 - MatchID_
,然后匹配除换行符以外的任何字符 1+ 次(
捕获组 2(?:
非捕获组\n(?!ID_).*
匹配换行符并断言右边的内容不是 ID_。如果是这种情况,匹配 0+ 次除换行符以外的任何字符
)*
关闭非捕获组并重复 0+ 次
)
关闭捕获组
例如:
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]);
}
推荐阅读
- mysql - 如何在nodejs中进行动态数量的mysql查询?
- react-native - 将字段输入从状态发送到 Firebase
- javascript - 如何正确地为按钮单击进行茉莉花测试
- apache-spark - 如何在查询中调用 oracle 存储过程?
- php - 从函数调用返回的字符串实例化一个类
- laravel - JSON_CONTAINS 无法识别我的列 mysql v.8.0.17 laravel 5.6
- mysql - SQL SELECT everthing 值为 5 但未指定从哪一列
- tensorflow - 如何在张量流数据集 api 中添加随机操作?
- arrays - Perl 数组唯一元素
- react-native - 从导航标题调用时反应原生动画不起作用