【问题标题】:One Line Regex, match all words separated by whitespace一行正则表达式,匹配由空格分隔的所有单词
【发布时间】:2019-10-10 14:07:12
【问题描述】:

我正在尝试创建一个正则表达式,可以将上面的整个行匹配到单独的组中:

示例消息: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

第二组:New York

第三组:America

第 4 组:INFO

第 5 组:Server is connected. Server Id [34] Address [127.0.0.1:54266]

我还尝试选择方括号 ([ ]) 内的任何内容,以及 IP 地址的特殊匹配情况。不过,这不必包含在同一个正则表达式中。但如果可能的话会很好。

我已经能够匹配各个组,但我似乎无法在 1 行中完成所有操作。

这是我目前所拥有的:

组 1:/[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{2}/

第二组:/(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}.*)\S+/

第三组:/(?<=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{2}.*\S.\s{3}).?\S+/

Group4:/(?<=\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}).*/

任何帮助将不胜感激。

【问题讨论】:

  • 你怎么知道York America和New York的区别?
  • 字段之间的字符是什么?多个空格字符,一个列表,还是其他什么?如果是多个空格字符,它们的数量是固定的还是取决于字段的长度?
  • 我会说你过于复杂了,你需要做的就是分割字符串,不管分割字符是什么,工作完成。如果你不能这样做,你将不会对正则表达式有更多的乐趣,因为你仍然不知道分隔符是什么。这似乎是格式很差的数据,JSON 或 CSV 将是发送数据的更好选择
  • 喜欢string.split(/\s{2,}/)?
  • 假设字段本身永远不会包含超过一个连续空格是否合理?这将使解决方案变得微不足道(使用 `{2,}` 作为分隔符)

标签: javascript regex regex-group


【解决方案1】:

我认为 Liam 和 Thomas 是对的,只是除以 \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

【讨论】:

  • 哇,太棒了!不幸的是,我无法将 .split 用于我的应用程序。生病可能最终会使用您的解决方案,即使它是一个怪物:)。我确实注意到如果消息部分中没有括号中的术语,它不匹配任何组。这些括号中的术语是可选的,可能根本不会出现,或者它们可能以不同的顺序出现或出现多次。
  • @Sam 为什么不能使用拆分?这有点像XY problem。
  • @3limin4t0r 因为这是我需要提供给图书馆的正则表达式。
【解决方案2】:

我认为你已经完成了,如果你知道你的分隔符至少是两个空格,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2023-01-20
    • 2013-07-09
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多