У вас есть 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);