正则表达式正前瞻未按预期匹配

Regex positive lookahead not matching as expected

我必须使用正则表达式来匹配多个字符串并捕获部分字符串。

示例字符串可能如下所示:



目标是延迟匹配并捕获罗伯特·帕默的 中间名 直到姓氏 (palmer) 出现在字符串中 AND 确保字符串的其余部分与静态文本匹配(robert ___ palmer sent for the boat)。

我已经使用积极的前瞻来找到中间名并在找到 palmer 时停止匹配:

/robert (.+?)(?=\spalmer) palmer/

正确匹配;

robert eric palmer

robert eric william palmer

和正确的不匹配;

robert eric william palmer palmer


问题:

当我将其余静态文本添加到正则表达式时;

/robert (.+?)(?=\spalmer) palmer sent for the boat/

匹配不正确;

robert eric william palmer palmer sent for the boat
robert eric palmer palmer sent for the boat

我怎样才能延迟匹配 palmer 作为中间名并仍然断言其余的静态文本匹配?

我希望这是有道理的!

改用贪心匹配怎么样?例如:

robert (.+) palmer

否则它可能会在第一次出现 palmer 而不是最后一次出现时离开。示例 here

如前所述,您的示例中不需要前瞻。如果要延迟匹配直到 palmer 的部分与 optional palmer 和其后的指定子字符串,请将其添加到模式中。

robert (.+?) palmer(?:.* palmer)? sent for the boat

可选的 greedy (?:.* palmer)?consume lazy 部分之间的间隙sent for the boat.

See this demo at regex101   (?:打开一个非捕获组)


对于刚刚连续的palmer之后,一个思路要用robert (.+?) (?:palmer )+sent for the boat

您可以使用

robert ((?:(?!palmer).)+?) palmer sent for the boat

参见regex demo

详情

  • robert - 文字子串
  • ((?:(?!palmer).)+?) - 带有 的捕获组 #1 匹配任何字符 (.),出现 1 次或多次但尽可能少,不会启动palmer 字符序列
  • palmer sent for the boat - 文字子串。

要展开模式以获得更好的性能,请使用

robert ([^p]*(?:p(?!almer)[^p]*)*) palmer sent for the boat

参见 this regex demo