我正在阅读一个 XML 文件,其中我正在替换某些单词。我不想替换 XML 元素或属性中的单词。我使用消极的向后看和向前看,我做到了 90%。但是,如果一个值出现在包含我想要替换的字符串的属性中,那么它就会被替换。我不想那样。
我的正则表达式:
-$fi=~s/(?<!<|\/)(?<!value=")\bis\b(?!=)/iss/g
此正则表达式与元素属性和值属性不匹配。但是,如果有像
value="hello there"
这样的文本,并且我用某个单词替换 there
,那么它就会被替换。我想要一个正则表达式,如果在 there
开头没有出现单词 value="
,它将进行搜索。
执行此操作的正确工具是 XML 解析器。
如果您可以接受快速而肮脏的黑客攻击,并且会仔细检查结果以确保没有破坏某些内容,那么使用正则表达式修改元素内容的一种方法是在
>
和<
。例如,要将 There 的第一个实例(不区分大小写)转换为全部大写:
$_ = '<p1 value="Hello there">foo bar There baz</p1>';
if (s/(>[^<]*) \b(there)\b ([^<]*<\/)/$1 . uc($2) . $3/iex) {
print;
}
else {
print "No match.\n";
}
替代寻找
>
,它假定是开放标记分隔符<
字符 - 与前一个字符一样,左侧的所有内容there
两侧都有字边界断言 \b
<
字符,后跟 </
— 与前一个一样,所有内容都位于右侧然后它重新组装结果,除了 tHeRe,但它以大写形式出现。
在线尝试以查看
的输出<p1 value="Hello there">foo bar THERE baz</p1>
替换末尾的开关表示
/i
— 不区分大小写/e
— 执行替换并将其结果插入字符串/x
— 扩展语法,在本例中,在 \b(there)\b
周围添加空格,将其与模式的其余部分分开,以提高可读性警告: 正则表达式缺乏足够的能力来全面处理 XML。如果您的 XML 很简单,上面的代码可能会起作用。如果没有,它可能会错过替换,或者更糟糕的是进行替换,从而破坏您的文档。仔细检查结果。