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

问题描述 投票:0回答:2

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

只有当前一个和下一个单词不以CAPS开头时,才应突出显示一个单词。

我创建了正则表达式“(?!\ bA-Z \ b)\ sSouls +(?!\ s [A-Z,0-9])”但它也突出了“灵魂”,其前一个词以首字母开头。

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

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

javascript regex regex-lookarounds
2个回答
0
投票

试试Regex:(?<=\b[a-z]\w+\b \b)Souls(?=\b [a-z]\w+\b)

Demo


0
投票

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

然后在一个组中捕获Souls并使用正向前瞻来断言后面是空格的1+倍并且不以大写字符开头。

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

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

这将匹配

  • \b字边界
  • (开始捕捉小组 [^\WA-Z]\w* +匹配单词char但不是大写字母,单词char的0+倍,空格的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);
© www.soinside.com 2019 - 2024. All rights reserved.