RegEx使用RegExp.exec从字符串中提取所有匹配项
|
我正在尝试解析以下类型的字符串:
[key:\"val\" key2:\"val2\"]
里面有任意的key:\“ val \”对。我想获取键名和值。
对于那些好奇的人,我试图解析任务战士的数据库格式。
这是我的测试字符串:
[description:\"aoeu\" uuid:\"123sth\"]
这是要强调的是,除了空格,冒号周围没有空格而且值始终用双引号引起来,键或值中的任何内容都可以位于键或值中。
在节点中,这是我的输出:
[deuteronomy][gatlin][~]$ node
> var re = /^\\[(?:(.+?):\"(.+?)\"\\s*)+\\]$/g
> re.exec(\'[description:\"aoeu\" uuid:\"123sth\"]\');
[ \'[description:\"aoeu\" uuid:\"123sth\"]\',
\'uuid\',
\'123sth\',
index: 0,
input: \'[description:\"aoeu\" uuid:\"123sth\"]\' ]
但是description:\"aoeu\"
也与此模式匹配。如何找回所有比赛?
没有找到相关结果
已邀请:
18 个回复
细屠截殴些
获得所有匹配项:
尝试使用此JSFiddle:https://jsfiddle.net/7yS2V/
桔马牛
具有全局标记
,6ѭ将以数组的形式返回所有匹配项。 例如:
旦彤
函数:
告耸
这是基于Grasssea的答案,但更短。 注意,必须设置'g \'标志以使内部指针在调用之间向前移动。
鞘垒飘
以数组形式返回所有匹配项。 如果出于某种神秘的原因,您需要ѭ14comes附带的其他信息,作为以前答案的替代方法,则可以使用递归函数来代替循环,如下所示(看起来也很酷)。
如前面的评论中所述,在正则表达式定义的末尾带有ѭ8以便在每次执行中向前移动指针很重要。
暑袜眠退
桔马牛
循环使用:
或者,如果您想要一个数组:
蓟类
函数,有关说明和兼容性表,请参见此处。截至2019年4月,似乎支持Chrome和Firefox,但不支持IE,Edge,Opera或Node.js.好像它是在2018年12月起草的,所以给它一些时间来访问所有浏览器,但我相信它会实现的。 内置的
函数很不错,因为它返回一个可迭代的函数。它还会为每次比赛返回捕获组!所以你可以做类似的事情
似乎每个匹配对象都使用与“ 24”相同的格式。因此,每个对象都是匹配和捕获组的数组,以及三个附加属性
,
和
。所以看起来像:
有关ѭ21的更多信息,还有一个Google开发人员页面。也有polyfills / shimms。
柑恫祟
。 如果您没有ES9 如果您使用的是较旧的系统,则此功能可轻松复制和粘贴
用法示例:
输出:
襄挟款籍
缮记箔
// [\“老鼠\”,索引:0,输入:\“老鼠要切饭的骰子\”,组: 未定义] // [\“ dice \”,索引:13,输入:\“老鼠要切成薄片的米饭\”, 组:未定义] // [\“ rice \”,索引:18,输入:\“鼠标想切成小方块 rice \“,组:未定义] Chrome,Firefox,Opera当前支持该功能。根据您阅读本文的时间,请查看此链接以查看其当前支持。
糕泰灌
它将返回所有匹配项的数组...那会很好.... 但是请记住,它不会考虑组。它只会返回完整的匹配...
缮记箔
希望这可以帮助!
蓟类
看起来比评论更冗长,这就是没有评论的样子
请注意,任何不匹配的组都将在数组中列为“ 40”值。 该解决方案使用ES6扩展运算符来净化正则表达式特定值的数组。如果需要IE11支持,则需要通过Babel运行代码。
谦响局豢报
迪擅哨乘傅
如果您想探索/简化/修改表达式,可以 在右上角的面板上进行了说明 regex101.com。如果您愿意, 也可以看这个 链接,它如何匹配 针对一些样本输入。 测试
泪琉踞檄
,然后在每个捕获中将字符串切成捕获组的位置即可。
懊毁暗