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

通过regexp匹配字符串条目并在javascript中创建拆分数组[关闭]

  •  -1
  • mr__brainwash  · 技术社区  · 6 年前

    我有一根绳子:

    const str = 'my string is awesome <%010203%> and super cool <%090807%>'
    

    其中符号在 <%%> 是ID。 我有一个函数,用这个ID获取一些数据 getDataById(id) . 我想从这个字符串创建一个数组,它应该如下所示:

    const arr = ['my string is awesome ', getDataById('010203'), ' and super cool ', getDataById('090807')]
    

    我该怎么做?谢谢你

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jason Cust    6 年前

    因为我不知道你试过什么,我无法帮助你理解你在哪里可能会遇到困难。

    因此,从零开始,您似乎需要将字符串拆分为多个部分,并仅替换与函数调用匹配的ID格式部分的值。幸运的是,拆分发生在替换也发生的地方。

    解决第一部分,我们可以使用 split 使用regex作为分隔符,还使用捕获将id部分包括在输出中。

    str.split(/<%(\d+)%>/)
    

    如果不包括ID的捕获,则输出中将不包括分隔符。

    现在进行ID到函数调用的对话。 map 非常适合在数组上迭代 分裂 )并通过对每个元素的转换将其转换为一个新数组。但是,由于我们只想用函数调用替换ID,因此不需要转换每个值。这意味着我们需要测试什么时候转换值或不转换值。

    对于测试,一种简单的方法是使用另一个regex来查看该值是否为ID格式,但是,尽管很奇怪,也可能有一个非ID字符串的假正匹配。

    另一种方法是,由于拆分的输出是类似以下的数组:

    ['some string', ID, 'some other string', ID, 'this could look like an ID', ID, ...]
    

    然后我们可以很快看到ID是数组中的每个其他元素。使用 remainder (或modulo)在迭代的索引值上,可以让我们快速而确定地知道我们有一个ID。

    arr.map((val, index) => index % 2 ? getDataById(val) : val)
    

    const str = 'my string is awesome <%010203%> and super cool <%090807%>';
    
    const arr = str
      .split(/<%(\d+)%>/)
      .map((v, i) => i % 2 ? `getDataById('${v}')` : v); // outputting with template to show desired value
      
    console.log(arr);
        2
  •  0
  •   Nick Abbott    6 年前

    虽然向这样的数组中添加所有内容有点笨拙,但简单地替换字符串中的值会更容易。如果这对您有用,那么这里是一个简单的实现。

    const str = 'my string is awesome <%010203%> and super cool <%090807%>';
    
    function getDataById(id) {
      return '(My data: ' + id + ')';
    }
    
    console.log(str.replace(/<%(\d+)%>/g, getDataById('$1')));

    我们通过匹配来匹配任何标签 <% 后跟一个1位或多个数字的捕获事例,后跟一个 %> . 然后我们用我们的 getDataById() 函数并传递捕获案例的值。