我想把这个字符串分割成一个结构,
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来尝试解决您的问题。