我的正则表达式如下

/({{(?:(?:(?:for|if|while):\w+)|(?:do))}})|(?:{{(?:fi|endfor|dowhile:\w+)}})/g


我的示例输入如下

This is a sample {{if:val2}}abc{{fi}} injection{{while:val3}} {{endwhile}} string {{for:val}}repeated text{{endfor}} asdb lasdfk {{do}} basdf {{dowhile:val4}} asldf lkjasdf lajsdf aljsdf lkjasdf lasdf.


它匹配如下

javascript - 如何从非捕获组中获取文本的所有不匹配部分-LMLPHP

我希望所有其他不匹配的文本作为组。

我可以使用regex的RegExp.exec和lastIndex值来执行此操作,以使用javascript创建组。

但是,有什么方法可以使用RegExp本身来实现?

最佳答案

将模式中的所有捕获组转换为非捕获组后,可以使用String#split

s.split(/{{(?:(?:for|if|while):\w+|do|endwhile)}}|{{(?:fi|endfor|dowhile:\w+)}}/)


如果保留捕获组,它将与匹配的部分一起输出。

JS演示:



var s = 'This is a sample {{if:val2}}abc{{fi}} injection{{while:val3}} {{endwhile}} string {{for:val}}repeated text{{endfor}} asdb lasdfk {{do}} basdf {{dowhile:val4}} asldf lkjasdf lajsdf aljsdf lkjasdf lasdf.';
var rx = /{{(?:(?:for|if|while):\w+|do|endwhile)}}|{{(?:fi|endfor|dowhile:\w+)}}/;
console.log(
   s.split(rx)
)
// Getting rid of blank items and trim:
console.log(
   s.split(rx)
      .filter(function (x) { return x.trim() != ""; })
      .map(function (x) { return x.trim(); })
)

关于javascript - 如何从非捕获组中获取文本的所有不匹配部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57326413/

10-11 01:06