我必须使用正则表达式来匹配多个字符串并捕获字符串的一部分。
示例字符串如下所示:
目标是延迟匹配并捕获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 ,同时仍然断言其余的静态文本匹配项?
我希望这有道理!
答案 0 :(得分:2)
如前所述,样本中的前瞻是不需要的。如果您想将部分与optional palmer
和palmer
以及后面的指定子字符串进行延迟匹配,请将其添加到模式中。
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)