首页 > 解决方案 > 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线只有一条线,所以我期望值123456.

第二组AAAA行有 2 行,所以我需要值789101121141。此外,我需要知道789and101是相关联的(来自同一行),并且121and141是相关联的(来自同一行),但仍然是第二组的所有部分(与123and没有任何关联456

最终我想访问对象(javascript),例如

{ '123': '456'}

 {
    '789': '101',
    '121': '141
 }

如果一行中有 15 行 AAAA 行,则该对象将有 15 个键值对。

标签: javascriptregextypescript

解决方案


您可以使用这种两阶段方法。第一个正则表达式是捕获所有以开头的行AAAA\s+并将它们组合在一起,第二个正则表达式抓取k1k2值:

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 );


推荐阅读