从多个匹配中获取最后匹配
问题描述:
我想匹配并使用记事本++在我的文件中获取最后一次出现的模式。从多个匹配中获取最后匹配
我的文字:
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)
- 一个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替换为空字符串。
+1
完美的解决方案和解释。谢谢。 :-) – GurV
你的问题是不是在你正在尝试做的都清楚。如果您想要替换文件中最后一个东西的实例,则可以将光标移动到文件底部,然后在查找或替换窗口中将“方向”设置为“向上”。 – AdrianHHH
@GurV它看起来相当复杂。你还在努力吗? –
我无法提供单步解决方案。您可以使用['(?s)。*?\ b(X \ d {2})(?:(?!X \ d {2})。)* [“\ s]([^”\ s] + \。dun)+'](https://regex101.com/r/8YnjL6/1)替换为“$ 1 \ t \ t $ 2 \ n”,然后删除“尾部”(最后一次匹配后仍然存在) )。 –