代码之家  ›  专栏  ›  技术社区  ›  LongHike

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

  •  0
  • LongHike  · 技术社区  · 6 年前

    我有一段文字看起来是这样的:

    去年的预算 %%表名:预算年度:最后% 基于 %%表名:费用% .

    本年度预算 基于 %%表名:费用类型:预测%

    这个词 总是在那里。所有以冒号分隔的键值对都是可选的。

    我解决提取问题的方法是

    /%%table( *(\S+):(\S+) *)*%%/mg
    

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

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   Paolo Enigma    6 年前

    捕获组将 always capture the last iteration .

    必须迭代字符串:

    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]);
    }
        2
  •  0
  •   Patrick Roberts Benjamin Gruenbaum    6 年前

    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)