【问题标题】:Notepad++ Removing text between two strings if third string is present between other stringsNotepad ++如果在其他字符串之间存在第三个字符串,则删除两个字符串之间的文本
【发布时间】:2017-01-15 02:01:56
【问题描述】:

当且仅当这两个字符串之间存在第三个字符串时,我想删除两个字符串之间的文本,包括那些字符串。如果我可以使用 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

【问题讨论】:

  • 如果我的回答对你有帮助,请将其标记为解决方案。

标签: regex string notepad++


【解决方案1】:

您正在寻找的可以通过以下构造实现:

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

这仅当STRING_3 存在于两者之间时才匹配STRING_1STRING_2(该技术称为tempered greedy token)。


您也可以将其放在一行中:
STRING_1(?:(?!STRING_2)[\s\S])*?STRING_3(?:(?!STRING_2)[\s\S])*?STRING_2

a demo on regex101.com

【讨论】:

  • 漂亮!我正在研究它,但无法解决正则表达式将 first STRING_1 匹配到正确的 STRING_2 的问题
  • @Shovalt:如果你想要一些文学作品:rexegg.com/regex-quantifiers.html
  • 谢谢!在我来到这里之前,我花了很多时间试图自己弄清楚。最后,我把它放在一起: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_1 在 STRING_3 之前。不如您的解决方案优雅,当然也没有通用性。我使用(\n.*){5,50}?STRING_2 只是因为我无法让(\n.*)*?STRING_2 在那里工作;你知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多