我正在尝试将文本捕获为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之后”
有什么建议吗?
答案 0 :(得分:1)
您有2个捕获组。您没有获得第三部分的匹配项,因为在第一个交替中的正向提前不考虑字符串的结尾。您可以通过使用替换来查看空格或断言字符串的结尾来解决该问题
(?=[-\]] )(.*?)(?= - |$)
^^
如果这些匹配都可以,那么您可以通过使用字符类来简化-
或]
之类的[-\]]
来简化该模式,并在您省略省略项和组时使用现在只有比赛。
然后您的模式可能看起来像(也像前2个匹配项一样捕获了开头的连字符)
(?=[-\]] ).*?(?= - |$)
如果这是您的字符串,并且您希望有3个捕获组,则可以使用:
^.*?\[\d+\]([^-]+)-([^-]+)-\s*([^-]+)$
^
字符串的开头.*?
匹配除换行符非贪婪以外的所有字符\[\d+\]
匹配[
1个以上的数字]
([^-]+)-
捕获第1组,而不是-
匹配1次以上,然后匹配-
([^-]+)-
捕获第2组,而不是-
匹配1次以上,然后匹配-
\s*
匹配0+个空格字符([^-]+)
捕获第2组,匹配1次以上,而不是-
$
字符串结尾例如,根据注释创建所需的对象,您可以首先从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)