Regex 从多个匹配中获取最后一个匹配

Regex 从多个匹配中获取最后一个匹配,regex,notepad++,match,negative-lookahead,Regex,Notepad++,Match,Negative Lookahead,我正在尝试使用记事本++匹配并获取文件中最后出现的模式 我的文本: 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

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

我的文本:

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}).)*
替换为:

$1\t\t$2\n
但它返回给我的是:

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}$1\t\t$2\n)

详细信息

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

  • (?{1}
    -如果组1匹配。。。。
    • $1\t\t$2\n
      -替换为第一组值、两个选项卡、第二组值和换行符
  • -否则替换为空字符串

你的问题根本不清楚你想做什么。如果要替换文件中某个内容的最后一个实例,则可以将光标移动到该文件的底部,然后在“查找或替换”窗口中将
方向设置为
向上
。@GurV看起来相当复杂。你还在努力吗?我不能提供一个单步解决方案。您可以使用替换为
$1\t\t$2\n
,然后删除“尾部”(上次匹配后剩余的部分)。@WiktorStribiżew-谢谢。这对我很有用。我可以手动移除一个尾部零件。你可以加上它作为答案,我会接受的。再次感谢:)完美的解决方案和解释。谢谢。:-)