具有高级字符的非贪婪模式

Non-greedy pattern with advance characters

我有一个想要匹配的简单模式。在这句话中:

great. This is great&great&great. great.

我想立即匹配 'great' 个单词 'This is'。因此,第一个伟大的 不会 被归还,但接下来的三个必须被归还。最后一个应该不是。

我的表情是

This is (great&)*?(great)

但这returns只是第一个伟大的。我阅读了有关贪婪和非贪婪模式的信息,当我不必担心提前 'This is' 时,它非常有效。但是这些高级字符检查对我的用例很重要。我怎样才能得到所需的结果?

我可以使用:

This is (great&){0}(great)

第一场比赛,

This is (great&){1}(great)

第二次,依此类推。但这是一个麻烦的解决方案,我想我遗漏了一些关于非贪婪模式行为的信息。感谢任何帮助。谢谢!

一种选择是使用 alternation 并匹配您不需要的内容,并在单词边界之间使用 great 的捕获组。

^.*?This is |\b(great)\b
  • ^ 字符串开头
  • .*?This is 使用惰性量词 .*?
  • 匹配第一次出现的 This is
  • |
  • \b(great)\b 捕获组 1 中单词边界之间的伟大

看到一个Regex demo

更新

更新问题的一个可能解决方案是在一个交替中使用 2 个正后视。

(?:(?<=\bThis is )|(?<=\S))\bgreat\b
  • (?:非捕获组
    • (?<=\bThis is ) 正面回顾,断言左边的是 This is
    • |
    • (?<=\S) 正面回顾,断言左边是非空白字符
  • )关闭非捕获组
  • \bgreat\b 单词边界之间的匹配很好

Regex demo