正则表达式正向提前不符合预期

时间:2019-12-15 00:22:10

标签: regex regex-lookarounds regex-group

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

示例字符串如下所示:


  • 罗伯特 埃里克 送船的帕默
  • robert eric william 帕默(Palmer)上船

目标是延迟匹配并捕获robert palmer的 中间名 ,直到出现姓氏( palmer )为止字符串 AND 并确保字符串的其余部分与静态文本匹配(罗伯特___ Palmer发送给船上的人)。

我使用正向查找来查找中间名,如果找到 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 ,同时仍然断言其余的静态文本匹配项?

我希望这有道理!

3 个答案:

答案 0 :(得分:2)

如前所述,样本中的前瞻是不需要的。如果您想将部分与optional palmerpalmer以及后面的指定子字符串进行延迟匹配,请将其添加到模式中。

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

可选的贪婪 (?:.* palmer)?消耗 lazy 部分与sent for the boat之间的差距

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


之后连续palmer,有一个使用robert (.+?) (?:palmer )+sent for the boat的想法

答案 1 :(得分:2)

您可以使用

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

请参见regex demo

详细信息

  • robert -文字子字符串
  • ((?:(?!palmer).)+?)-具有tempered greedy token的捕获组#1与任何字符(.)匹配,出现1次或多次,但越少越好,这不会启动{{ 1}}字符序列
  • palmer-文字子字符串。

要展开图案以获得更好的性能,请使用

 palmer sent for the boat

请参见this regex demo

答案 2 :(得分:0)

使用贪婪匹配怎么办?例如:

robert (.+) palmer

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

enter image description here