正则表达式捕获一个组,但前提是前面有一个字符串,后面跟着一个字符串

Regex to capture a group, but only if preceded by a string and followed by a string

在 SO 和其他地方有一些 'typical' 问题解决方案的示例,但我们需要稍微不同版本的帮助。

我们有如下字符串

pies
bob likes,
larry likes,
harry likes
cakes

并使用以下正则表达式

(?<=pies\n|\G,\n)(\w+ likes)

只有当字符串以馅饼开头时,我们才能按预期捕获 'nnn likes',但是,如果它不以 'cakes' 结尾,我们还需要捕获失败,并且我们的这样做的尝试失败了。

Link 到正则表达式 101:https://regex101.com/r/uDNWXN/1/

感谢任何帮助。

我建议在开头添加额外的前瞻性,以确保字符串中有 cakes

(?s)(?<=\G(?!^),\n|pies\n(?=.*?cakes))(\w+ likes)

查看 regex demo(没有预期的匹配,在最后一行添加一些字符以获得匹配)。

图案详情

  • (?s) - DOTALL/singleline 修饰符让 . 匹配任何字符,包括换行符
  • (?<= - 正向后视需要紧靠当前位置左侧的以下内容:
    • \G(?!^),\n - 在上一场比赛结束后,一个逗号,然后是一个换行符
    • | - 或
    • ^pies\n(?=.*cakes) - 字符串的开头,pies,换行符后面没有尽可能多的 0+ 个字符,然后是 cakes 字符串
  • ) - 回顾结束
  • (\w+ likes) - 第 1 组:任何一个或多个字母、数字或下划线,然后是 space 和 likes.