javascript - RegExp 匹配多行输入和来自相邻行的组匹配
问题描述
假设我在文件中有一些文本
AAAA k1="123" k2="456"
several lines of other stuff
AAAA k1="789" k2="101"
AAAA k1="121" k2="141"
目标是捕获 k1 和 k2 值,但将分组保持在一起。因此,第一场比赛将返回 123 和 456 的组,第二场比赛将返回 789 和 101 以及 121 和 141 的组。
我可以编写正则表达式来获取任何单行,甚至匹配文件中的所有相关行,但无法弄清楚如何将匹配项保持在组中。
最困难的是,以 AAAA 开头的行数在各组之间不是恒定的,例如可能是 1 AAAA 行,然后是其他一些行,然后是 4 AAAA 行,等等。
编辑——好的,澄清一下,各种值需要按组分开。
所以第一组AAAA
线只有一条线,所以我期望值123
和456
.
第二组AAAA
行有 2 行,所以我需要值789
、101
、121
和141
。此外,我需要知道789
and101
是相关联的(来自同一行),并且121
and141
是相关联的(来自同一行),但仍然是第二组的所有部分(与123
and没有任何关联456
)
最终我想访问对象(javascript),例如
{ '123': '456'}
和
{
'789': '101',
'121': '141
}
如果一行中有 15 行 AAAA 行,则该对象将有 15 个键值对。
解决方案
您可以使用这种两阶段方法。第一个正则表达式是捕获所有以开头的行AAAA\s+
并将它们组合在一起,第二个正则表达式抓取k1
和k2
值:
const re1 = /(?:^AAAA\s+.*\n?)+/gm;
const re2 = /\s+k1="([^"]+)"\s+k2="([^"]+)"/g;
const str = `AAAA k1="123" k2="456"
several lines of other stuff
AAAA k1="789" k2="101"
AAAA k1="121" k2="141"`;
let m1;
let m2;
let result = [];
while ((m1 = re1.exec(str)) !== null) {
var grpMap = {};
while ((m2 = re2.exec(m1[0])) !== null)
grpMap[m2[1]] = m2[2]
result.push( grpMap );
}
console.log( result );
推荐阅读
- excel - Excel - 日期 - vba 文本框到表格
- python - PYQT QTimer 不启动
- java - java.lang.ClassNotFoundException: com.johnsnowlabs.nlp.DocumentAssembler spark 在 Pycharm 与 conda env
- python - Visual Studio 不运行我的 Python 脚本/调用定义的函数不起作用
- python - 装饰带有参数的函数未按预期工作
- accessibility - 将焦点转移到通过按钮单击添加的输入
- php - Trait 方法 customizeSlugEngine 尚未应用,因为与 App\Base\SluggableModel 上的其他 trait 方法有冲突
- hex - 创建十六进制 MAC 地址
- swift - 对未实现协议的 RestAPI 客户端进行单元测试
- c# - 如果 smtp 服务器需要身份验证,我可以签入 MailKit 吗?