【问题标题】:How can I split a string with a JavaScript regex?如何使用 JavaScript 正则表达式拆分字符串?
【发布时间】:2021-03-01 16:30:27
【问题描述】:

我正在尝试将此字符串拆分为某种结构,

20:33:15     From Deekshitha Oku : Me too

进入

{ time: "20:33:15", name: "Deekshitha Oku", message: "Me too" }

为此,我写了一个正则表达式,

(([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])(.*?)(From)\s(.*?).:\s(.*?).+

但这不是我所期望的,它在这里连接。我期望的是这样的,

[
  "20:33:15",
  "Deekshitha Oku",
  "Me too"
]

const match = "20:33:15     From Deekshitha Oku : Me too".match(/(([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])(.*?)(From)\s(.*?).:\s(.*?).+/);

console.log(match);

这个正则表达式有什么问题,我尝试了很多不同的方法:(

【问题讨论】:

  • 您的正则表达式中有太多的捕获组。每次使用一组新括号时,您都会创建一个新的捕获组,从而在您的正则表达式结果中创建一个新结果。相反,请使用以(?: 开头的非捕获组,除非您确实希望将该捕获组中的内容返回给您。

标签: javascript html regex


【解决方案1】:

尝试将您的正则表达式更改为:

^((?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*?From\s(.*?).:\s(.*).+$

然后就可以生成对象了:

const match = "20:33:15     From Deekshitha Oku : Me too".match(/^((?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*?From\s(.*?).:\s(.*).+$/);
const object = { time: match[1], name: match[2], message: match[3] };

console.log(object);

编辑:使用命名捕获组,您可以只使用match.name 等,而不必生成新对象:

const match = "20:33:15     From Deekshitha Oku : Me too".match(/^(?<time>(?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*?From\s(?<name>.*?).:\s(?<message>.*)$/).groups;

console.log(match);

注意匹配调用后添加的.groups

【讨论】:

  • 无论如何上面的正则表达式都会跳过最后一个字符,所以我发现这个工作^(?&lt;time&gt;(?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*?From\s(?&lt;name&gt;.*?).:\s*(?&lt;message&gt;.*$)$
  • 是的,我的错,我在回答中修正了它。
【解决方案2】:

不要拆分,将您的捕获放入命名的捕获组:

(?<time>^.{1,8}) *From (?<person>[^:]+?)(?= *:) *: *(?<message>.*$)

https://regex101.com/r/BAMv5K/1

console.log(/(?&lt;time&gt;^.{1,8}) *From (?&lt;person&gt;[^:]+?)(?= *:) *: *(?&lt;message&gt;.*$)/.exec(`20:33:15     From Deekshitha Oku : Me too`).groups)

【讨论】:

    【解决方案3】:

    我认为你只需要一些小的调整:

    /((?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])\s*From\s*([^:]*):\s*(.*)/
    

    首先,当您不想捕获信息时不要使用括号(就像您在 From 周围使用的那样)。其次,如果您只想使用括号进行分组而不是捕获,请使用 (?:) 而不是 ()。第三,非贪婪匹配比[^:]*(在我看来)这样的构造更复杂且更容易出错。说“匹配所有非冒号”更明确。

    请参阅https://regex101.com/r/3dLjbV/1 以尝试解决您的问题。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2011-12-28
      相关资源
      最近更新 更多