【问题标题】:Regex pattern to match a word based on previous and next word?正则表达式模式根据前一个和下一个单词匹配一个单词?
【发布时间】:2019-03-26 11:31:55
【问题描述】:

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

只有在上一个和下一个单词不以大写字母开头时,才应突出显示一个单词。

我已经创建了正则表达式“(?!\bA-Z\b)\sSouls+(?!\s[A-Z,0-9])”,但它也用前一个以大写开头的单词突出显示了“Souls”。

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

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

【问题讨论】:

  • 您可以使用组然后对结果进行后处理,请参阅((?:^|\b[a-z]\w*)\s+)(Souls)(?!\s+[A-Z0-9])
  • 谢谢,这对我有用。

标签: javascript regex regex-lookarounds


【解决方案1】:

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

Demo

【讨论】:

  • 请注意,javascript 中的lookbehind 仅受 Chrome 支持。
  • 谢谢,这在 chrome 浏览器中对我有用,但在其他浏览器中对我有用。
  • @nishant 如果它应该在其他浏览器中工作,为什么不使用捕获组?
  • 正如 Toto 所说,非 chrome 浏览器可能还不支持后视。 (我忽略了这种可能性)。您可能需要考虑@Thefourthbird 的回答。
  • 在 chrome 中可以正常工作,但在 Firefox 中出现错误“SyntaxError: invalid regexp group”。
【解决方案2】:

如果匹配应该在 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多