【问题标题】:C# Regex remove character within the element name only, without replacing the valueC# Regex 仅删除元素名称中的字符,而不替换值
【发布时间】:2012-01-15 13:20:32
【问题描述】:

我只想在 C# 中使用正则表达式去除 XML 元素标签中的“:”。

我知道解析文档是代替正则表达式的方法。但它是一个遗留项目,它使用正则表达式替换 XML 文档内容。不是处理 XML 文档的理想方法,但我无能为力。

我不擅长正则表达式,只是想不出一种方法来仅从元素标签而不是值中替换 ':'...

例如 <tag:name> the value with the tag http://www.example.com </tag:name>

我只想在元素名称中用 _ 替换 : 而不是值。所以结果应该是:

<tag_name> the value with the tag http://www.example.com </tag_name>

有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# .net xml regex


    【解决方案1】:

    这根针应该做你想做的:

    <[^>]*(:)[^>]*>

    第一个模式组将在标签名称中包含 (:)。如果您想进行替换,可以将(<[^>]*)(:)([^>]*>) 替换为$1_$3,其中$1$3 是子模式。

    【讨论】:

    • 感谢您的回复。恐怕它不会按预期工作。我尝试使用Regex.Replace(content, "(<[^>]*)(:)([^>]*>)", "_") 替换,但它也将所有空标签替换为'_'
    • 我相信你想要,Regex.Replace(content, @"(<[^>]*)(:)([^>]*>)", "$1_$3")
    • 啊,我的错。虽然仍然不完美:|我的 XML 文件有一个元素,例如 <Assets:POS1_filedetails></Assets:POS1_filedetails>,但它不会转换为 <Assets_POS1_file></Assets_POS1_file>
    • frb,对我有用,在 .net 中:[regex]::replace('','(]*)( :)([^>]*>)','$1_$3')
    • @Sharon,我认为它应该在那里工作。如果一个标签中有 两个 或多个冒号,它将替换最后一个冒号。 (我认为这在 XML 中不正常,但我不确定。)
    【解决方案2】:

    这对你有用吗?

    Regex tagRegex = new Regex("<[^>]+>");
    yourXML = tagRegex.Replace(yourXML, delegate(Match thisMatch)
    {
       return thisMatch.Value.Replace(":", "_");
    });
    

    【讨论】:

    • 它实际上将替换出现在开始标记、结束标记、注释或处理指令中任何位置的冒号,如果由 CDATA 部分分隔,则在文本内容中以及在 DTD 中的各个位置出现 - 包括例如属性名称或属性值中的冒号、注释中的冒号或引用外部 DTD 的 URI 中的冒号。是的,你是对的 - 正则表达式不是这样做的方法。
    • @mikel,也许如果你把你的针换成&lt;\s*[^\s=&gt;]+ 这样的东西,它会更独特。这样它就不会匹配属性。你可以走得更远一点,说它不能以 ! 开头,&lt;\s*[^!][^\s=&gt;]+
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2014-11-17
    • 2019-04-30
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多