2016-09-07 105 views
1

当且仅当在这两个字符串之间存在第三个字符串时,我想删除两个字符串(包括那些字符串)之间的文本。如果我可以使用Notepad ++中的替换功能来做到这一点,我会非常喜欢它。记事本++如果在其他字符串之间存在第三个字符串,则删除两个字符串之间的文本

这里是什么,我需要改变的实体模型:

asdfnjaslfjsa 
asdfjaskldfsafkldj 
asdfjsadfk 
STRING_1 
sanjvnlamf 
fas g 
gsegvrs 
STRING_2 
STRING_1 
asf sf gfsjasak 
qweuwiouqnv 
STRING_3 
awi iavbfa c 
anfiab 
STRING_2 
STRING_1 
asmorancm 
anib fas 
STRING_2 
sdabfashbdfbc ds 

更改为此:

asdfnjaslfjsa 
asdfjaskldfsafkldj 
asdfjsadfk 
STRING_1 
sanjvnlamf 
fas g 
gsegvrs 
STRING_2 
STRING_1 
asmorancm 
anib fas 
STRING_2 
sdabfashbdfbc ds 
+0

如果我的回答对您有帮助,请将其标为解决方案。 – xenteros

回答

3

什么你正在寻找可以用下面的结构来实现:

STRING_1 
(?:(?!STRING_2)[\s\S])*? 
STRING_3 
(?:(?!STRING_2)[\s\S])*? 
STRING_2 

只有在STRING_3为presense时,才能与STRING_1匹配为STRING_2 t之间(该技术被称为回火贪婪令牌)。


你可以把它放在同一行,以及:

STRING_1(?:(?!STRING_2)[\s\S])*?STRING_3(?:(?!STRING_2)[\s\S])*?STRING_2 

a demo on regex101.com

+0

美丽!我正在研究它,但无法解决正则表达式将_first_ STRING_1匹配到正确的STRING_2 – Shovalt

+1

@Shovalt的问题:如果您需要一些文献:http://www.rexegg.com/regex-quantifiers。 html – Jan

+0

谢谢!在我来这里之前,我花了很多时间试图弄清楚自己。最后,我把它们放在一起:'STRING_1(\ n。*){2,7} STRING_3(\ n。*){5,50}?STRING_2' - 因为STRING_3总是离STRING_1仅几行当它出现时,STRING_2总是更远,所以如果“STRING_1(\ n。*){2,7} STRING_3”发现了某些内容,它始终是STRING_3之前的最后一个STRING_1。不像你的解决方案那么优雅,当然也不是多功能的。我使用了'(\ n。*){5,50}?STRING_2',因为我无法使'(\ n。*)*?STRING_2'在那里工作;你知道为什么吗? –

相关问题