【问题标题】:Find inner to outer match of element by applying regex通过应用正则表达式查找元素的内部到外部匹配
【发布时间】:2022-11-02 23:48:34
【问题描述】:
我正在尝试为字符串(如在 javascript 中动态评估的准备好的语句)实现替换机制。我有替代品
[{username:"Max",age:10}]
例如,假设我们将字符串作为输入(username) is (age),因此查找替换很容易通过属性及其值进行。
但是,我想要更高级的东西,其中括号被“识别”并从内到外评估,例如输入:
[{username:"Max",age:10,myDynamicAttribute:"1",label1:'awesome', label2:'ugly'}]
和字符串
(username) is (age) and (label(myDynamicAttribute))。在替换的第一次迭代中,字符串应该变成
(username) is (age) and (label1)
在第二个Peter is 10 and awesome。是否有任何工具或模式可以用来首先“理解”内括号并评估另一个?我尝试了正则表达式,但无法创建先匹配内括号然后匹配外括号的正则表达式。
【问题讨论】:
标签:
javascript
regex
algorithm
【解决方案1】:
我们可以编写a regular expression,它找到一个不包含内部括号的带括号的表达式,使用表达式的内部作为我们数据对象的键,用该值替换整个表达式,然后重复。当字符串不包含这样的括号表达式时,我们将停止,并原封不动地返回字符串。
这是一种方法:
const interpolate = (data, str, parens = str .match (/(([^()]+))/)) =>
parens ? interpolate (data, str. replace (parens [0], data [parens [1]])) : str
const data = {username: 'Max', age: 10, myDynamicAttribute: '1', label1: 'awesome', label2: 'ugly'}
const str = `(username) is (age) and (label(myDynamicAttribute))`
console .log (interpolate (data, str))
这将导致使用这些字符串进行一系列递归调用:
"(username) is (age) and (label(myDynamicAttribute))",
"Max is (age) and (label(myDynamicAttribute))",
"Max is 10 and (label(myDynamicAttribute))",
"Max is 10 and (label1)",
"Max is 10 and awesome"