2017-03-31 34 views
1

我想匹配并使用记事本++在我的文件中获取最后一次出现的模式。从多个匹配中获取最后匹配

我的文字:

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 

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

+0

你的问题是不是在你正在尝试做的都清楚。如果您想要替换文件中最后一个东西的实例,则可以将光标移动到文件底部,然后在查找或替换窗口中将“方向”设置为“向上”。 – AdrianHHH

+0

@GurV它看起来相当复杂。你还在努力吗? –

+0

我无法提供单步解决方案。您可以使用['(?s)。*?\ b(X \ d {2})(?:(?!X \ d {2})。)* [“\ s]([^”\ s] + \。dun)+'](https://regex101.com/r/8YnjL6/1)替换为“$ 1 \ t \ t $ 2 \ n”,然后删除“尾部”(最后一次匹配后仍然存在) )。 –

回答

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和任意两位数字。由于它是贪婪的,它将使它到达下一个字符开始禁止序列的位置,并且将回溯到随后的子模式所需的最后一个“顿”。
  • ["\s] - 一个空格或一个双引号
  • ([^"\s]+\.dun) - 第2组捕获一个或多于空白和双引号,然后点其它更多字符和dun
  • | - 或
  • (?:(?!X\d{2}).)* - 相同像上面那样锻炼了贪婪的象征。

代用细节

  • (?{1} - 如果第1组匹配....
    • $1\t\t$2\n - 与所述第一组值,两个突片,所述第二组值和替换换行
  • ) - else替换为空字符串。

enter image description here

+1

完美的解决方案和解释。谢谢。 :-) – GurV