如何从js正则表达式的结束行中捕获组?

时间:2019-07-05 13:16:34

标签: regex

我正在尝试将文本捕获为3组,我设法捕获了2组,但是第3组有问题。

这是文本:

  

<13> 4月5日16:09:47 node2服务:2016-04-05 16:09:46,914信息[3]   Drivers.KafkaInvoker-KafkaInvoker.SendMessages-发送后   itemsCount = 1

我正在使用以下正则表达式:

(?=- )(.*?)(?= - )|(?=])(.*?)(?= -)

我的第3组应该是:“在发送itemsCount = 1之后”

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您有2个捕获组。您没有获得第三部分的匹配项,因为在第一个交替中的正向提前不考虑字符串的结尾。您可以通过使用替换来查看空格或断言字符串的结尾来解决该问题

(?=[-\]] )(.*?)(?= - |$)
                     ^^

如果这些匹配都可以,那么您可以通过使用字符类来简化-]之类的[-\]]来简化该模式,并在您省略省略项和组时使用现在只有比赛。

然后您的模式可能看起来像(也像前2个匹配项一样捕获了开头的连字符)

(?=[-\]] ).*?(?= - |$)

Regex demo

如果这是您的字符串,并且您希望有3个捕获组,则可以使用:

^.*?\[\d+\]([^-]+)-([^-]+)-\s*([^-]+)$
  • ^字符串的开头
  • .*?匹配除换行符非贪婪以外的所有字符
  • \[\d+\]匹配[ 1个以上的数字]
  • ([^-]+)-捕获第1组,而不是-匹配1次以上,然后匹配-
  • ([^-]+)-捕获第2组,而不是-匹配1次以上,然后匹配-
  • \s*匹配0+个空格字符
  • ([^-]+)捕获第2组,匹配1次以上,而不是-
  • $字符串结尾

Regex demo

例如,根据注释创建所需的对象,您可以首先从match[0]获取所有匹配项,然后将它们存储在数组中。

拥有所有值之后,使用键和值组装对象。

var output = {};
var regex = new RegExp(/(?=[-\]] ).*?(?= - |$)/g);
var str = `<13>Apr 5 16:09:47 node2 Services: 2016-04-05 16:09:46,914 INFO [3] Drivers.KafkaInvoker - KafkaInvoker.SendMessages - After sending itemsCount=1`;
var match;
var values = [];
var keys = ['Thread', 'Class', 'Message'];

while ((match = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (match.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  values.push(match[0]);
}
keys.forEach((key, index) => output[key] = values[index]);
console.log(output);

答案 1 :(得分:0)

您的原始表达式很好,只是缺少了$

(?=- )(.*?)(?= - |$)|(?=])(.*?)(?= -)

Demo

,也许我们会对其稍作修改,使其类似于:

(?=-\s+).*?([A-Z].*?)(?=\s+-\s+|$)|(?=]\s+).*?([A-Z].*?)(?=\s+-)

Demo