Одна строка Regex, сопоставьте все слова, разделенные пробелом - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать regEx, который может сопоставить всю вышеуказанную строку в отдельные группы:

Пример сообщения: 2019-10-07 11:13:19.75 New York America INFO Server is connected. Server Id [34] Address [127.0.0.1:54266]

РЕДАКТИРОВАТЬ: группы разделяются несколькими пробельными символами вминимум 2 пробельных символа, но обычно 3.

РЕДАКТИРОВАТЬ 2: заключенные в квадратные скобки термины в части сообщения могут вообще не отображаться, или один может появляться без другого, или они могут появляться в другом порядке.

Группа 1: 2019-10-07 11:13:19.75

Группа 2: New York

Группа 3: America

Группа 4: INFO

Группа 5: Server is connected. Server Id [34] Address [127.0.0.1:54266]

Я также пытаюсь выбрать что-нибудь в квадратных скобках ([]), а также специальный регистр соответствия для IP-адресов. Это не должно быть включено в то же регулярное выражение, хотя. Но было бы неплохо, если бы это было возможно.

Я смог сопоставить отдельные группы, но, похоже, я не могу заставить все это идти в одну строку.

Вот что у меня так далеко:

Группа 1: /[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{2}/

Группа 2: /(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}.*)\S+/

Группа 3: /(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}.*\S.\s{3}).?\S+/

Группа 4: /(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}(.*\S.\s{3}){2}).?\S+/

Группа 5:/(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}(.*\S.\s{3}){3}).*/

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я думаю, что вы перестали это делать, если вы знаете, что ваш разделитель занимает по крайней мере два пробела, просто split на \s{2,}:

const message = `2019-10-07 11:13:19.75   New York   America   INFO   Server is connected. Server Id [34] Address [127.0.0.1:54266]`;

const groups = message.split(/\s{2,}/g)
console.log(groups);
1 голос
/ 10 октября 2019

Я думаю, что Лиам и Томас правы, просто делим на \s+ и обрезаем значения.

Но мне было любопытно, как это переформулировать ...

Попробуйте этого монстра:
(?<date>\d{4}-\d{2}-\d{2})\s+(?<time>\d{2}:\d{2}:\d{2}\.\d{2})\s+(?<city>(?:\S|\s(?!\s))*)\s+(?<country>(?:\S|\s(?!\s))*)\s+(?<level>INFO|WARN|ERROR)\s+(?<message>[^\[]+\[(?<serverid>\d+)\][^\[]+\[(?<serverip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5})\])

здесь: regex101

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