【问题标题】: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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2011-06-13
      相关资源
      最近更新 更多