正则表达式模式以匹配基于上一个和下一个单词的单词?

时间:2019-03-26 11:31:55

标签: javascript regex regex-lookarounds

我正在尝试根据与特定客户要求匹配的上一个和下一个单词来突出显示一个单词。

仅当上一个和下一个词不是以CAPS开头时,才应突出显示一个词。

我创建了正则表达式“(?!\ bA-Z \ b)\ sSouls +(?!\ s [AZ,0-9])”,但它还会突出显示以前面的大写字母开头的单词“ Souls”。 / p>

https://regex101.com/r/wPmijX/2

在这种情况下,“深色”旁边的“灵魂”不应该突出显示,因为它以大写字母开头。在第二段中仅应突出显示“灵魂”。第三段中的“灵魂”事件不应突出显示为“游戏”以大写字母开头。

2 个答案:

答案 0 :(得分:0)

如果匹配项在2个单词之间,则可以使用2个捕获组。首先捕获不以大写字符和以下空格开头的单词。

然后将Souls捕获到一个组中,并使用正向先行断言其后的内容是空间的1倍以上,并且不以大写字母开头。

然后,您可以在替换中使用捕获的组。

\b([^\WA-Z]\w* +)(Souls)(?= +[^\WA-Z])

这将匹配

  • \b字边界
  • (开始捕获组
    • [^\WA-Z]\w* +匹配一个字符char但不匹配一个大写字母,0乘以一个char,1乘以一个空格
  • )关闭捕获组
  • (Souls)分组捕获Souls
  • (?=积极肯定地断言以下内容
    • +[^\WA-Z]匹配一个空格1次以上,后跟一个字符char,但不要大写
  • )提前关闭

Regex demo

const regex = /\b([^\WA-Z]\w* +)(Souls)(?= +[^\WA-Z])/gm;
const str = `When I finally finished Dark Souls for the first time, that feeling of struggle and triumph, of having wandered a vast and lonesome landscape, stuck with me for weeks. 

The creator of the Souls series and game director on Sekiro: Shadows Die Twice.

The Souls Game start with competent price.`;
const subst = `$1<strong>$2</strong>`;
const result = str.replace(regex, subst);

document.write(result);

答案 1 :(得分:0)

尝试使用正则表达式:(?<=\b[a-z]\w+\b \b)Souls(?=\b [a-z]\w+\b)

Demo