【问题标题】:Regular expression to replace text正则表达式替换文本
【发布时间】:2014-03-11 02:12:22
【问题描述】:

我对正则表达式很陌生。我正在使用 UltraEdit,并希望使用正则表达式进行如下所述的更改。

我有一些文本格式如下:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="000760.rock" title="222"/>
    <Music format="ditamap" href="000756.rock" title="333"/>
</Music>

我需要在href 前面添加前缀“Z”,扩展名为.rock

href="000760.rock" --> href="Z000760.rock"

输出应如下所示:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="Z000760.rock" title="222"/>
    <Music format="ditamap" href="Z000756.rock" title="333"/>
</Music>

在 UltraEdit 中执行此操作的正则表达式是什么?

【问题讨论】:

  • 有没有办法在没有 Ultra Edit 的情况下做同样的事情?使用批处理文件?

标签: regex ultraedit


【解决方案1】:

我不确定 Ultraedit,但我认为它接近 notepad++:

查找内容:(href=")(.+?\.rock")
替换为:$1X$2

XZ,因为您的问题并不清楚。

【讨论】:

  • 感谢 M42 的帮助
【解决方案2】:

重新写了我的回答

  1. 添加新的用例 OP,其中某些值具有 X 前缀且不得替换。
  2. 我最初是在不需要时将双引号字符放在括号中。

我回答的第一种情况是所有 HREF 值都没有 X 前缀。

查找:

href="([^"]*)\.rock"

并替换:

href="X\1.rock"

开始:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="000760.rock" title="222"/>
    <Music format="ditamap" href="000756.rock" title="333"/>
</Music>

完成:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="X000760.rock" title="222"/>
    <Music format="ditamap" href="X000756.rock" title="333"/>
</Music>

显示第一个结果的屏幕截图如下。

正则表达式的分解:

  1. 查找:href="([^"]*)\.rock"
    1. href=" - 找到href="
    2. ([^"]*) - 这将创建第一个反向引用 - 告诉引擎查找并记住括号内的所有内容:[^"]*,以便我们可以在替换部分引用它。
      1. [^"] - 这部分模式表示任何不是双引号的字符。
      2. [^"]* 末尾的星号是一种重复模式,表示查找与前面的内容匹配的零个或多个字符(因此查找零个或多个不是双引号的字符)。
    3. \.rock" 这定义了模式的其余部分,必须是 .rock"
    4. 请注意,我已经转义了句点字符:\.。这是因为句点在正则表达式中具有特殊含义,我们告诉正则表达式我们的意思是字面点或句点。
  2. 替换:href="X\1.rock"
    1. href="X - 表示按字面意思输出href="X..
    2. \1 - 表示将 \1 替换为我们创建的第一个反向引用(零个或多个非双引号字符)。
    3. .rock" - 表示按字面意思输出.rock"
      1. 请注意,我不需要在这里转义句点,因为它在替换中的含义不同 - 它只是表示文字点。

第二种情况是针对 OP 的评论,即某些 HREF 值已经具有 X 前缀。在这种情况下,请按如下方式更改正则表达式。

查找:

href="([^X][^"]*)\.rock"

并替换:

href="X\1.rock"

开始:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="000760.rock" title="222"/>
    <Music format="ditamap" href="X000756.rock" title="333"/>
    <Music format="ditamap" href="000757.rock" title="444"/>
    <Music format="ditamap" href="X000758.rock" title="555"/>
    <Music format="ditamap" href="000759.rock" title="666"/>
</Music>

完成:

<Music href="6000111.genre" title="AAA">
    <Music format="ditamap" href="X000760.rock" title="222"/>
    <Music format="ditamap" href="X000756.rock" title="333"/>
    <Music format="ditamap" href="X000757.rock" title="444"/>
    <Music format="ditamap" href="X000758.rock" title="555"/>
    <Music format="ditamap" href="X000759.rock" title="666"/>
</Music>

显示第二个结果的屏幕截图如下。

正则表达式的分解:

  1. 查找:href="([^X][^"]*)\.rock"
    1. href=" - 找到href="
    2. ([^X][^"]*) - 这会创建第一个反向引用 - 告诉引擎查找并记住括号之间的所有内容:([^X][^"]*)*,以便我们可以在替换部分引用它。
      1. [^X]* - 这部分模式表示任何不是 X 的字符。
      2. [^"] - 这部分模式表示任何不是双引号的字符。
      3. [^"]* 末尾的星号是一种重复模式,表示查找与前面的内容匹配的零个或多个字符(因此查找零个或多个不是双引号的字符)。
    3. \.rock" 这定义了模式的其余部分,必须是 .rock"
    4. 请注意,我已经转义了句点字符:\.。这是因为句点在正则表达式中具有特殊含义,我们告诉正则表达式我们的意思是字面点或句点。
  2. 替换:href="X\1.rock"
    1. href="X - 表示按字面意思输出href="X..
    2. \1 - 表示将 \1 替换为我们创建的第一个反向引用(零个或多个非双引号字符)。
    3. .rock" - 表示按字面意思输出.rock"
      1. 请注意,我不需要在这里转义句点,因为它在替换中的含义不同 - 它只是表示文字点。

【讨论】:

  • 谢谢罗伯特!效果很好。一个问题:我该如何修改,以便如果 X 已经存在,那么它不应该找到(或替换)。即,它只找到 '000760.rock' 而不是 'X000760.rock'。否则,您提到的解决方案会添加另一个 X 作为前缀。
  • @user1749707,如果 X 可能(或可能不)已经存在,请将其用作您的 findhref=["]X?([^"]*)\.rock["] 并保留 replace 相同:href="X\1.rock".
  • 嗨,我用过 ["]X?([^"]*)\.rock["] 但它也用 X 找到值。它不应该找到并替换已经有 X 前缀的. 有什么问题吗?
  • @user1749707, href=["]X?([^"]*)\.rock["] 在大多数情况下仍然可以,因为输出是相同的 - 即您仍然会得到所有条目之前都有 X 的结果。以防万一您绝对不希望更改这些案例的其他原因,我为此添加了第二个解决方案。我还添加了对正则表达式的解释,并更正了一个错误,即我在不需要时将双引号放在方括号中。
猜你喜欢
  • 2017-10-18
  • 2017-01-21
  • 2019-11-29
  • 2021-10-11
  • 2011-09-05
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多