Как захватить из группы от конца строки в регулярных выражениях JS? - PullRequest
2 голосов
/ 05 июля 2019

Я пытаюсь записать текст в 3 группы. Мне удалось захватить 2 группы, но возникла проблема с 3-й группой.

Это текст:

<13> 5 апреля 16:09:47 node2 Сервисы: 2016-04-05 16: 09: 46,914 INFO [3] Drivers.KafkaInvoker- KafkaInvoker.SendMessages - После отправки itemsCount = 1

я использую следующее регулярное выражение:

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

Моя 3-я группа должна быть: "После отправки itemsCount = 1"

есть предложения?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

У вас есть 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);
0 голосов
/ 05 июля 2019

Ваше первоначальное выражение в порядке, просто отсутствует $:

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

Демо

и, возможно, мы немного изменим это выражение, похожее на:

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...