从多场比赛中获取最后一场比赛

Getting last match from multiple matches

我正在尝试使用记事本++匹配并获取文件中最后一次出现的模式。

我的文字:

X12 

Source =asdjkasjd
 file="x/y1.dun"
       "x/y2.dun"
       "x/y3.dun"

asds12

    X22
       p/q/xy.dun
asda=23

source =asdf

    X44
1000
1001
      file="abc.dun"

我期望使用查找和替换是这样的:

X12     x/y3.dun
X22     p/q/xy.dun
X44     abc.dun

到目前为止我尝试过的:

(X\d{2}).*?([^"\s]+dun)((?!X\d{2}).)*

替换为:

\t\t\n

但它 returns 我这个:

X12     x/y1.dun    //Which is the first match
X22     p/q/xy.dun
X44     abc.dun

如何在一场比赛中获得最后一场比赛?我正在寻找获得最后一场比赛的通用方法。

您可以匹配并捕获您需要保留的内容,只匹配您不需要的内容,并且仅在匹配到捕获组时才替换为文本:

查找内容(?s)\b(X\d{2})(?:(?!X\d{2}).)*["\s]([^"\s]+\.dun)|(?:(?!X\d{2}).)*
替换为(?{1}\t\t\n)

参见regex pattern demo

详情:

  • (?s) - DOTALL 修饰符(您可以删除它并检查 . 匹配换行符 选项)
  • \b - 在单词开头匹配 X 的前导单词边界
  • (X\d{2}) - 第 1 组捕获 X(请注意,如果您不想匹配小写 [=,则必须打开 匹配大小写 18=]) 和任意两位数字
  • (?:(?!X\d{2}).)* - 匹配任何字符的调节贪婪标记,零次或多次重复,后面不跟 X 和任何两位数字。由于它是贪心的,它会补足到下一个字符开始禁止序列的位置,并回溯到后续子模式所需的最后一个"dun"。
  • ["\s] - 空格或双引号
  • ([^"\s]+\.dun) - 第 2 组捕获除空格和双引号以外的一个或多个字符,然后是一个点和一个 dun 子字符串
  • | - 或
  • (?:(?!X\d{2}).)* - 与上面相同的贪婪标记。

更换详情:

  • (?{1} - 如果第 1 组匹配....
    • \t\t\n - 替换为第一组值、两个制表符、第二组值和换行符
  • ) - 否则替换为空字符串。