如何在Notepad++中为目标行前后直至分隔符的行添加书签?
正则匹配问题:选中包含指定行的完整分隔区块
原始文本
------------------------------------------------------------- 2021-05-18 - Tortrettert.webm 521.483 "Totrrtp" : 5 times "GDtretP" : 17 times ------------------------------------------------------------- 2021-06-25 - Cghtytryrtyhtjyuj.webm 480.0 "Certhiltertdren" : 2 times "Berterorn" : 1 times "Woertmartn" : 4 times "higerthesertertt" : 66 times "birrtertths" : 5 times "woertertmrtertan_" : 1 times ------------------------------------------------------------- 2021-06-26 - Thytyrtytyng.webm 536.999 "Edtryucytryated" : 2 times "Avrtyertyrtyage" : 2 times "Yertyartys" : 4 times "Strychootrylrtying" : 2 times ------------------------------------------------------------- 2021-06-27 - Wortyrtyrthtyts.webm 552.016 "Coffytryhtyjee" : 11 times ------------------------------------------------------------- 2021-06-29 - Moshrhtyjykuyukjity.webm 485.966 "Potrhwhrthetyjrful" : 16 times "Artrhmithrres" : 2 times "Nurthctrhlearthr" : 8 times "Catrhtrhpabrthilrthity" : 1 times -------------------------------------------------------------
需求
要为所有包含: 1 times的行所在的、被-------------------------------------------------------------分隔的完整区块添加书签,也就是选中整个区块的所有内容(包括前后分隔符)。
尝试的正则及问题
我用了这个正则:
^.*: 1 times.*$(?s)(?:(?!^-{61}$).)*^-{61}$
它能匹配目标行到下一个分隔符的内容,但没法匹配目标行之前到上一个分隔符的部分,导致没法选中整个区块。
期望选中的内容
------------------------------------------------------------- 2021-06-25 - Cghtytryrtyhtjyuj.webm 480.0 "Certhiltertdren" : 2 times "Berterorn" : 1 times "Woertmartn" : 4 times "higerthesertertt" : 66 times "birrtertths" : 5 times "woertertmrtertan_" : 1 times ------------------------------------------------------------- ------------------------------------------------------------- 2021-06-29 - Moshrhtyjykuyukjity.webm 485.966 "Potrhwhrthetyjrful" : 16 times "Artrhmithrres" : 2 times "Nurthctrhlearthr" : 8 times "Catrhtrhpabrthilrthity" : 1 times -------------------------------------------------------------
问题分析与解决办法
原正则的问题
你的正则起始匹配的是包含: 1 times的行(^.*: 1 times.*$),相当于从目标行开始往后找内容,完全没处理目标行之前的区块头部和分隔符,自然没法选中整个区块。
正确的正则表达式
要匹配整个包含目标行的分隔区块,需要从区块的开头分隔符开始,一直匹配到结尾分隔符,同时确保中间包含目标行。可以用这个正则:
(?s)^-{61}$(?:(?!^-{61}$).)*?: 1 times.*?(?=^-{61}$|$)
或者更直观的多行模式写法:
(?m)^-{61}$\n(?:.*\n)*?: 1 times.*\n(?:.*\n)*?^-{61}$
正则解释
(?s):开启单行模式,让.能匹配换行符^-{61}$:匹配区块开头的分隔符行(61个减号)(?:(?!^-{61}$).)*?:非贪婪匹配任意内容,直到找到包含: 1 times的行(避免跳过其他区块): 1 times.*:匹配目标行.*?(?=^-{61}$|$):继续非贪婪匹配,直到遇到下一个分隔符行或者文本结束(?m):开启多行模式,让^和$匹配每行的开头和结尾
这样就能精准选中每个包含: 1 times行的完整分隔区块了。
内容的提问来源于stack exchange,提问作者Pubg Mobile
相关产品推荐
相关产品推荐

