重新写了我的答案
- 添加新的用例 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"。
- 请注意,我不需要在这里转义句点,因为它在替换中没有相同的含义——它只是表示文字点。