首页 > 解决方案 > 正则表达式捕获具有特定单词的组

问题描述

示例文本:

begin
more text 
art
  id:213213
  code:"XXX"
  name:234
art-
art
  id:543
  name:72
  code:"AAA"
art-
art
  code:"XXX"
  id:32
  name:46
art-
art
  code:"CCC"
  id:8765
art-
art
  id:876
  code:"DDD"
art-
even more text
even more text
end

目标:

试图让组以artart-包含的位置开始"XXX"

所以我想要

art
  id:213213
  code:"XXX"
  name:234
art-

art
  code:"XXX"
  id:32
  name:46
art-

从regex101开始,但没有走多远。

试过:

(?sm)(.*?)(?:art.*?art-)(.*?)

(?sm)(.*?)(?:art.*?"XXX".*?art-)(.*?)

任何帮助,将不胜感激。

标签: regexregex-group

解决方案


我们可以使用Tempered Greedy token来做到这一点。试试这个正则表达式:

art(?:(?!art-)[\s\S])*code:"XXX"(?:(?!art-)[\s\S])*art-

点击演示

扩展:

  • art- 火柴art
  • (?:(?!art-)[\s\S])*- 匹配不以 text 开头的任何字符的 0+ 次出现art-。简而言之,它匹配任何东西,直到找到下一次出现art-
  • code:"XXX"- 火柴code:"XXX"
  • (?:(?!art-)[\s\S])*- 再次匹配不以文本开头的任何字符的 0+ 次出现art-
  • art-- 火柴art-

推荐阅读