我如何分割字符串与JavaScript正则表达式?



我想把这个字符串分割成一个结构,

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);

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

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

^((?:[0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*?Froms(.*?).: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]).*?Froms(.*?).: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]).*?Froms(?<name>.*?).:s(?<message>.*)$/).groups;
console.log(match);

注意match调用后增加的.groups

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

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

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

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

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

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

首先,当您不想捕获信息时不要使用父元素(就像您在From中使用的那样)。第二,使用(?:)代替(),如果你只是想要父级分组,而不是捕获。第三,非贪婪匹配比[^:]*这样的结构更复杂,更容易出错(在我看来)。说' match all not-colon">

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

最新更新