【问题标题】:Replace using RegEx in notepad++在记事本++中使用正则表达式替换
【发布时间】:2012-11-02 12:25:42
【问题描述】:

我想用 xyz 来替换 XML 文件中的所有名称。换句话说,替换标签之间的所有内容(包括空格)。我做错了什么?

Search: (<name>)(.*)(</name>)
Replace: \1xyz\3

【问题讨论】:

  • 试一试会出现什么问题?

标签: xml regex notepad++


【解决方案1】:

您正在尝试parse XML with regular expressions

但是,无论如何,您做错的是使用贪婪的重复。这将从第一个 &lt;name&gt; 一直到最后一个 &lt;/name&gt; (即使它们不属于一起),因为 .* 将尝试尽可能多地消耗,同时仍然满足匹配条件..改用这个:

Search: (<name>).*?(</name>)
Replace: \1xyz\2

或者为了安全起见,您也可以转义 &lt;&gt;,因为它们在某些特定情况下是元字符(但不是在这个情况下):

Search: (\<name\>).*?(\</name\>)
Replace: \1xyz\2

在这两种情况下,这都会使.* 变得不贪婪,即它会尽可能少地消耗。

并确保您升级到 Notepad++ 6,因为在此之前,Notepad++ 的正则表达式引擎存在一些问题。

最后,正如 hoombar 在评论中指出的那样 . 默认匹配每个字符 除了 换行符。在 Notepadd++ 中,您可以通过勾选 . matches newline 复选框来更改此行为。

【讨论】:

  • 您可能还想选中“.matches new line”框
  • 我通常会转义 &lt;&gt; 以防止出现意外行为 \&lt;\&gt;
  • @Ariaan 这可能是一个品味问题(我通常更喜欢可读性),并且只会在命名的捕获组内有所不同,不是吗?
  • @m.buettner 你是对的,但我更愿意准备在更大的正则表达式中重用,以防你需要扩展你的表达式。写复杂的表达式我不认为这是一个坏习惯。
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多