我正在尝试用Regex做很多方法,但我没有强大的正则表达能力。
我的情况是,我有这个字符串What is this and this is cool
,在这种情况下我需要拆分is
但我不会拆分What is
,我只想在is
和this
之间拆分cool
。
我尝试了这个正则表达式(?!What)....(\sis\s)
,但这将返回this is
,我只需要第二个is
。
谢谢先进
单线程正则表达式解决方案:
(?:\bis\b)?((?:(?!\bis\b)(?:What\s+is\b)?.?)+)
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
或单个字符或什么都没有
)+
尽可能多地重复)
结束捕获组#1split()
方法将捕获组中的匹配部分视为输出数组,因此在正则表达式中匹配is
并捕获任何其他内容。
为了避免在What
以外的其他单词上拆分,您只需要在组内的替换中添加每个单词:
(?:\bis\b)?((?:(?!\bis\b)(?:(?:What|How|Who)\s+is\b)?.?)+)
你可能需要设置i
标志,以便在你想要或分裂时捕获what is
。