【问题标题】:Getting last match from multiple matches从多场比赛中获取最后一场比赛
【发布时间】:2017-03-31 15:52:26
【问题描述】:

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

我的文字:

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

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

【问题讨论】:

  • 您的问题根本不清楚您要做什么。如果要替换文件中某项的最后一个实例,则可以将光标移动到文件底部,然后在查找或替换窗口中将Direction 设置为Up
  • @GurV 看起来相当复杂。你还在努力吗?
  • 我无法提供单步解决方案。您可以使用(?s).*?\b(X\d{2})(?:(?!X\d{2}).)*["\s]([^"\s]+\.dun)+ 替换为$1\t\t$2\n,然后删除“尾巴”(最后一场比赛后剩下的)。
  • @WiktorStribiżew - 谢谢。这对我行得通。我可以手动删除一个尾随部分。您可以将其添加为答案,我会接受。再次感谢:)

标签: regex notepad++ match negative-lookahead


【解决方案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 - 替换为第一个组值、两个制表符、第二个组值和一个换行符
  • ) - 否则替换为空字符串。

【讨论】:

  • 完美的解决方案和解释。谢谢。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2012-03-27
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多