从多场比赛获得最后一场比赛

时间:2017-03-31 15:52:27

标签: 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"

我期望使用find-and-replace是这样的:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

请参阅regex pattern demo

<强>详情:

  • (?s) - DOTALL修饰符(您可以删除它并检查 .匹配换行符选项)
  • \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 - 替换为第一组值,两个标签,第二组值和换行符
  • ) - 用空字符串替换。

enter image description here