首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从字符串(Javascript regex)中提取具有可选出现项的冒号分隔的键值?

如何从字符串(Javascript regex)中提取具有可选出现项的冒号分隔的键值?
EN

Stack Overflow用户
提问于 2018-08-20 00:03:15
回答 2查看 256关注 0票数 0

我有一个文本,看起来是这样的:

去年预算%%表名:预算年份:最近%%基于预算

本年度预算%%表名:预算年度:当前%%已批准:无基于%%表名:费用类型:预测%%

word 始终在那里。所有冒号分隔的键值对都是可选的。

我解决提取问题的方法是

代码语言:javascript
复制
/%%table( *(\S+):(\S+) *)*%%/mg

但是这个表达式只返回每个匹配的最后一个键:值对。示例代码如下:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 00:16:45

捕获组将执行always capture the last iteration

你必须遍历这个字符串:

代码语言:javascript
复制
var mystring = 'Last years budget %%table name:budget year:last%% was based on %%tablename:expenses%%.'
const re = /(?:%%table )?([^:\s%]+:[^%\s]+)/g;

while (match = re.exec(mystring)) {
  	console.log(match[1]);
}

票数 0
EN

Stack Overflow用户

发布于 2018-08-20 01:13:09

您可以尝试另一种方法,使用正则表达式捕获所有表,然后将每个表拆分为键/值对,如下所示:

代码语言:javascript
复制
const mystring = `Last years budget %%table name:budget year:last%% was based on %%tablename:expenses%%.

This years budget %%table name:budget year:current%% approved:no is based on %%table name:expenses type:forecast%%`

const tables = []

mystring.replace(/%%table((?:\s*\S+:\S+)+)\s*%%/g, (table, entries) => tables.push(entries))

tables.forEach((entries, index, array) => {
  array[index] = entries.trim().split(/\s+/g).map(entry => entry.split(':'))
})

console.log(tables)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51919468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档