2

我对正则表达式很陌生。我正在使用 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 中执行此操作的正则表达式是什么?

4

2 回答 2

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. 请注意,我不需要在这里转义句点,因为它在替换中没有相同的含义——它只是表示文字点。
于 2014-02-13T03:54:13.620 回答
1

我不确定 Ultraedit,但我认为它接近记事本++:

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

X或者Z因为你的问题不清楚。

于 2014-02-12T16:12:54.300 回答