一行正则表达式,匹配所有由空格分隔的单词
One Line Regex, match all words separated by whitespace
我正在尝试创建一个正则表达式,可以将上面的整行匹配到单独的组中:
示例消息: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 个。
EDIT2:消息部分中括号中的术语可能根本不会出现,或者一个可能没有另一个出现,或者它们可能以不同的顺序出现。
第 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]
我还尝试 select 方括号 ([ ]) 内的任何内容以及 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}).*/
如有任何帮助,我们将不胜感激。
我认为 Liam 和 Thomas 是对的,只是除以 \s+
和 trim 的值。
但我很好奇如何对此进行正则表达式...
试试这个怪物:
(?<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
我认为你做得太过分了,如果你知道你的分隔符至少有两个空格,请按 \s{2,}
调整 split
:
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);
我正在尝试创建一个正则表达式,可以将上面的整行匹配到单独的组中:
示例消息: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 个。
EDIT2:消息部分中括号中的术语可能根本不会出现,或者一个可能没有另一个出现,或者它们可能以不同的顺序出现。
第 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]
我还尝试 select 方括号 ([ ]) 内的任何内容以及 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}).*/
如有任何帮助,我们将不胜感激。
我认为 Liam 和 Thomas 是对的,只是除以 \s+
和 trim 的值。
但我很好奇如何对此进行正则表达式...
试试这个怪物:
(?<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
我认为你做得太过分了,如果你知道你的分隔符至少有两个空格,请按 \s{2,}
调整 split
:
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);