在XML中替换文本时忽略粗体和斜体标签

-2 投票
1 回答
721 浏览
提问于 2025-04-17 13:48

可能重复的问题:
正则表达式匹配开放标签,除了XHTML自包含标签

我有一个任意的XML字符串,其中还包含了<b>和<i>这样的标签,它们有通常的含义。
我需要在纯文本中进行字符串替换,而不想替换节点定义中的内容。

举个例子,我想把“hello”替换成一个星号(*)。像这样的XML:<hello a="hello">text sayh<b>ell</b>o more text</hello> 应该变成 <hello a="hello">text say* more text</hello>

有什么好的方法来做到这一点呢?
我本来打算只用regex,但这个想法被投票否决了。

1 个回答

0

这里有一个非常简单粗暴(强调一下是粗暴)的解决方案,它的规则是“只有当下一个尖括号不是闭合尖括号时才匹配”。具体代码如下:

hello(?![^<>]*>)

这个方法可能在你的XML文件上有效,但在有效的XML中可能会以各种方式失败(在无效的XML中更容易出错)。

编辑:

自从我最初的回答以来,问题已经发生了很大变化,所以这个答案现在不再正确。如果你想忽略粗体/斜体标签,你需要先完全去掉它们,方法是搜索</?[bi]>并把这些标签替换成空字符串,然后再运行上面的正则表达式(但这样会把所有这些标签都去掉,而不仅仅是hello里面的那些),或者使用

</?[bi]>h</?[bi]>e</?[bi]>l</?[bi]>l</?[bi]>o</?[bi]>(?![^<>]*>)

来替代上面的正则表达式。现在你应该能明白,正则表达式并不是处理这种任务的可靠工具。但这从评论中应该已经很明显了。

撰写回答