Regex 替换节点属性内容的正则表达式

Regex 替换节点属性内容的正则表达式,regex,replace,Regex,Replace,我有一个如下所示的xml文档: 此处的一些文本employee idName=员工employee此处的一些经理文本经理 如何在属性中用主管替换员工,用员工替换经理 谢谢, g正则表达式无法处理XML所属的语言类。然而,当然有一种骇人的方法可以做到这一点: 您可以只匹配idName=something(包括等号和引号),然后将其替换为idName=somethingelse 然而,这当然只在上面显示的确切字符串肯定不会作为文本显示在任何XML元素体中时才起作用。如果是这样的话,就真的没有办法找

我有一个如下所示的xml文档:

此处的一些文本employee idName=员工employee此处的一些经理文本经理

如何在属性中用主管替换员工,用员工替换经理

谢谢,
g

正则表达式无法处理XML所属的语言类。然而,当然有一种骇人的方法可以做到这一点:

您可以只匹配idName=something(包括等号和引号),然后将其替换为idName=somethingelse 然而,这当然只在上面显示的确切字符串肯定不会作为文本显示在任何XML元素体中时才起作用。如果是这样的话,就真的没有办法找到一个合适的XML解析器


虽然现代正则表达式通常可以处理比常规语言更多的事务,但是正则表达式只能处理这么多事务。您需要一个上下文无关的语法来解析XML。

我同意,在理想情况下,您应该使用合适的XML解析器

然而,这个世界并不理想,如果需要,正则表达式可以处理这个问题。 下面是一个使用perl/sed的示例,它应该很容易转换为任何语言:

s/<node idName="employee">(.*?)<\/node>/<node idName="supervisor">$1<\/node>/g
这可以很容易地修改为包含其他属性,它看起来像这样:

s/<node (.*?idName=)"employee"(.*?)>(.*?)<\/node>/<node $1"supervisor"$2>$3<\/node>/g

以此类推,如果XML包含大的数据块,请注意它是否需要大量内存。

您应该使用XML解析器来完成此任务,而不是使用XML解析器regex@Gzer当前位置请阅读并重新考虑您的方法。让我明确一点,我并不推荐这是最好的方法,这部分是对fgysin答案的回应。我不知道你是否因为没有想到使用解析器而将它标记为regex,因为解析器对你来说太复杂了,或者因为你出于另一个原因特别想要一个regex。无论如何,至少这是可行的;