需要搜索点才能拆分,但只有当我没有匹配其他子字符串时我才需要

时间:2018-03-03 22:33:39

标签: javascript regex

我正在尝试使用Regex做很多方法,但我不具备正则表达式的强大技能。

我的情况是,我有这个字符串What is this and this is cool,在这种情况下我需要拆分is但我不会拆分What is,我只想拆分{{1}在isthis之间。

我尝试使用此正则表达式cool,但这将返回(?!What)....(\sis\s),我只需要第二个this is

谢谢高级

1 个答案:

答案 0 :(得分:1)

TL; DR

单线程正则表达式解决方案:

(?:\bis\b)?((?:(?!\bis\b)(?:What\s+is\b)?.?)+)

Regex live demo

JS代码:



var re = /(?:\bis\b)?((?:(?!\bis\b)(?:What\s+is\b)?.?)+)/;
console.log(
  "What is this and is What is this is cool What is this is"
  .split(re)
  .filter(Boolean)
);




整体哲学

此正则表达式尝试匹配is字词,只要它变为1,否则只要它们不是What is,它就会继续匹配is个字符或其他字符。它匹配并捕获is以外的任何内容。

这里的技巧是使用调节令牌来查看下一次出现是否为is。如果没有,请尝试匹配What is或单个字符。此过程一直持续到is

  • (?:\bis\b)?尝试匹配单词is
  • (开始捕获组#1
    • (?:开始非捕获组
      • (?!\bis\b)看下一个单词是is
      • (?:What\s*is\b)?.?如果没有尝试匹配What is或单个字符或
    • )+重复尽可能多的
  • )结束捕获组#1

split()方法将捕获组中的匹配部分视为输出数组,从而在正则表达式中匹配is并捕获任何其他内容。

为了避免分割What以外的其他单词,您只需要在组内的替换中添加每个单词:

(?:\bis\b)?((?:(?!\bis\b)(?:(?:What|How|Who)\s+is\b)?.?)+)

您可能需要设置i标记,以便在需要或分割时捕获what is