首页 > 解决方案 > 如何在不同的组中匹配 X 个完整的单词?

问题描述

我目前正在尝试将搜索词每侧的 X 个单词与三个匹配组进行匹配,包括该词之前的 X 个词、该词、该词之后的 X 个词。

值得注意的是,我需要这个正则表达式才能在 Javascript 中工作。

例如,如果我的完整字符串是:“你好,这是一个长句子,在某处有一个匹配的词”

如果我每边要匹配的单词的 X 数是 2 并且我的搜索词是“句子”,我希望我的正则表达式匹配返回:

我尝试过使用括号来组成组,以及使用\w简写来匹配整个单词。

这让我非常接近,匹配我想要的所有内容,但只是没有将匹配分成 3 个单独的组。

(\w+ ){0,2}(string)( \w+){0,2}

要测试的字符串: this is my long string and i know what it is

预期成绩:

标签: javascriptregex

解决方案


问题是您在捕获组中只有一个单词,然后您正在重复该组,因此,只有最后一次出现将被放置在捕获组中。您需要将一个单词放入非捕获组,然后将 X 个单词放入捕获组。

尝试这样的事情:

((?:\w+[ ]){2})(string)((?:[ ]\w+){2})

正则表达式演示

Javascript 示例:

const regex = /((?:\w+[ ]){2})(string)((?:[ ]\w+){2})/gm;
const str = `this is my long string and i know what it is`;

let m = regex.exec(str);
m.forEach((match, groupIndex) => {
  console.log(`Found match, group ${groupIndex}: ${match}`);
});

显然,这只会匹配目标字符串之前和之后的两个单词(如您所述)。如果您实际上打算匹配两个或更少的单词(如您的模式所示),您可以使用{0,2}代替{2}.


推荐阅读