【问题标题】:Multi-line search & replace for Beginning and End of Each Line in Notepad++Notepad ++中每行开头和结尾的多行搜索和替换
【发布时间】:2017-06-20 09:36:18
【问题描述】:

首先,我希望能够做两件事:

第一件事:

要提取 foo_abc(以及类似的每隔一行,例如 goo_zxy 和 doo_fgh),我需要删除一些附加的文本 BEFORE foo_abc 和 之后 foo_abc。

例如:

TEXTBEFOREfoo_abcTEXTAFTER

文本前goo_zxy文本后

TEXTBEFOREdoo_fghTEXTAFTER

获得:

foo_abc

goo_zxy

doo_fgh

第二件事:

我现在需要在 beforeafter foo_abc 再次附加不同的文本。 像这样:

TextAfoo_abcTextB

所以我所做的是:

查找:^

替换:TextA

查找:$

替换:TextB

效果很好,但我必须执行查找和替换 TWICE,这不是很有效。为了避免这种情况,我发现了这个:Multiple word search and replace in notepad++

并像这样应用它:

查找:(^)|($)

替换:(?1TextA)(?2TextB)

但效果不太好。

并且,如前所述,我需要此功能适用于 EACH 和每一行: 例如:

foo_abc

goo_zxy

doo_fgh

我需要在每一行的开头插入 TextA,在每一行的末尾插入 TextB,如下所示:

TextAfoo_abcTextB

TextAgoo_zxyTextB

TextAdoo_fghTextB

这可以吗? (是的,我实际上需要对超过 10000 行执行此操作,而不仅仅是 3 行,并且想要一种有效的方式来执行此操作)。

我是否错过了一种更快的方法来完成所有这些工作?也许通过在 TEXTBEFORETEXTAFTER 上的 '1st Thing' 中执行搜索和替换,使用 TextATextB 分别是一次性的吗?

非常感谢。

编辑:是的,它们是文字字符串。是的,它们确实包含特殊字符,因为它们代表 URL 的一部分。

【问题讨论】:

  • TEXTBEFORETEXTAFTER 是文字字符串吗?尝试^(TEXTBEFORE)|TEXTAFTER$ 并替换为(?{1}TextA:TextB)
  • 问题。是要保持固定的文本,还是要替换的前后文本是固定的?
  • 请给我们展示真实案例。 foo_abc都是3个小写字母,下划线,3个小写字母吗?
  • @WiktorStribiżew 抱歉,是的,它们是文字字符串。
  • @LukStorms 是的。

标签: regex replace editor notepad++ text-editor


【解决方案1】:

有两种情况:1)您要替换 TEXTBEFORETEXTAFTER 而不管它们是否存在,2)TEXTBEFORETEXTAFTER 必须存在

场景 1

您可以为此使用单个搜索和替换操作:

查找内容^(TEXTBEFORE)|TEXTAFTER$
替换为(?{1}TextA:TextB)

注意:如果TEXTBEFORETEXTAFTER 包含特殊字符,您可以使用

找到什么^(\QTEXTBEFORE\E)|\QTEXTAFTER\E$

详情

  • ^(TEXTBEFORE)- 在行首匹配并捕获到第 1 组 TEXTBEFORE
  • | - 或
  • TEXTAFTER$ - 匹配行尾的 TEXTAFTER

替换模式

  • (?{1} - 如果组 1 匹配,则
    • TextA - 返回TextA
    • : - 否则
    • TextB - 替换为 TextB
  • ) - 条件替换模式结束。

场景 2

如果您需要匹配以某个文本开头并以另一个文本结尾的行,请使用

查找内容^TEXTBEFORE(.*?)TEXTAFTER$
替换为TextA$1TextB

详情

  • ^ - 行首
  • TEXTBEFORE - 这里有一些文字
  • (.*?) - 组 1(可以使用替换模式中的 $1 反向引用来引用)匹配除换行符以外的任何 0+ 字符
  • TEXTAFTER - 一些文字在...
  • $ - 行尾。

【讨论】:

  • 欣赏。不幸的是,我认为由于 TextA 和 TextB 中的特殊字符,我无法让它工作。我的结果是(其中 AA 代表文本,“AA --AA-AA-AA 10 "AA" 代表 TextA):AA --AA-AA-AA 10 "AA i>foo_abc
  • - 不是字符类之外的特殊字符。请发布一个真实的例子。
  • 感谢您的澄清 - 至于为什么它当时不起作用,这很不寻常。我应该发布一个更好的例子。
【解决方案2】:

试试:

TEXTBEFORE(.+?)TEXTAFTER

替换为

TextA$1TextB

例子和解释见this

如果需要查找整行:

^TEXTBEFORE(.+?)TEXTAFTER$

替换和以前一样。

【讨论】:

  • 效果很好——即使是特殊字符。谢谢。
  • 但是,它不会在一行的开头/结尾找到文本。查看我的更新。
  • @WiktorStribiżew 感谢您的关注 - 非常感谢。
猜你喜欢
  • 2013-10-18
  • 2012-01-14
  • 2012-07-04
  • 2012-07-08
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多