重新写了我的答案
- 添加新的用例 OP,其中某些值具有 X 前缀且不得替换。
- 我最初在不需要时将双引号字符放在括号中。
我回答的第一种情况是没有一个 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>
显示第一个结果的屏幕截图如下。

正则表达式的细分:
- 寻找:
href="([^"]*)\.rock"
href="
- 这发现href="
([^"]*)
- 这将创建第一个反向引用 - 告诉引擎查找并记住括号之间的所有内容:[^"]*
以便我们可以在替换部分中引用它。
[^"]
- 这部分模式表示任何不是双引号的字符。
- 末尾的星号
[^"]*
是一个重复模式,表示查找与它之前的内容匹配的零个或多个字符(因此找到零个或多个不是双引号的字符)。
\.rock"
这定义了模式的其余部分,必须是.rock"
- 请注意,我已经转义了句点字符:
\.
. 这是因为句点在正则表达式中具有特殊含义,我们告诉正则表达式我们的意思是字面点或句点。
- 代替:
href="X\1.rock"
href="X
- 说从字面上输出href="X
..
\1
- 说\1
用我们创建的第一个反向引用替换(零个或多个不是双引号的字符)。
.rock"
- 表示按字面意思输出.rock"
。
- 请注意,我不需要在这里转义句点,因为它在替换中没有相同的含义——它只是表示文字点。
第二种情况是响应 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>
显示第二个结果的屏幕截图如下。

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