需要搜索点进行拆分,但只有在与其他子字符串不匹配时才需要

问题描述 投票:4回答:1

我正在尝试用Regex做很多方法,但我没有强大的正则表达能力。

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

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

谢谢先进

javascript regex
1个回答
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单词,只要它进入一个,否则它将继续匹配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

© www.soinside.com 2019 - 2024. All rights reserved.