从XML名称标记中删除无效字符 – RegEx C#

我有一个带有xml数据的字符串,我从Web服务中提取。 数据很丑陋,并且在xml的Name标签中有一些无效的字符。 例如,我可能会看到类似的东西:

Scott the Coder
My address

地址名称字段中的#无效。 我正在寻找一个正则表达式,将从名称标签中删除所有无效字符但是将所有字符保留在xml的Value部分中。 换句话说,我想使用RegEx仅从开头名称标签和结束名称标签中删除字符。 其他一切都应该保持不变。

我还没有所有无效的字符,但这会让我开始:#{}&()

有可能做我想做的事吗?

我有一个简单的表单,有两个文本区域和一个按钮。 这似乎可以解决问题。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Text.RegularExpressions; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Regex r = new Regex(@"(?<=\<\w+)[#\{\}\(\)\&](?=\>)|(?<=\)"); textBox2.Text = r.Replace(textBox1.Text, new MatchEvaluator(deleteMatch)); } string deleteMatch(Match m) { return ""; } } } 

如果你的目的只是检查Xml节点名称的有效性,我建议你看一下XmlConvert类; 特别是VerifyNameVerifyNCName方法。

另请注意,使用该类,您可以使用EncodeNameEncodeLocalName方法接受任何文本作为节点名称。

使用这些方法比执行正则表达式更容易,更安全,更快捷。

除非你真的只有一个要处理的文件,否则RegEx是一个有问题的方法。 痛苦,挫折,错误是你的未来……

真的想使用RegEx,这里有一些我在Perl中使用过的有用的东西。

您是否考虑过使用解析器?

两个要考虑:

LINQ for XML

的XmlDocument

一旦解析,您可以重新保存麻烦的部分或只是以您的程序方式继续。

试试这个:

 s = Regex.Replace(s, @"[#{}&()]+(?=[^<>]*>)", ""); 

如果前瞻成功,则匹配后的下一个尖括号是右指向( > ),表示匹配发生在标记内。

当然,这假定文本格式合理,并且除了标签中的角度之外不包含尖括号。

您可以使用字符串替换来替换所有无效的字符。 通常,ascii控件字符会在XML读取中产生问题。

避免使用此function

  public static string CleanInvalidXmlChars( this string text) { // From xml spec valid chars: // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]"; return Regex.Replace(text, re, ""); } xmlcontent = xmlcontent.CleanInvalidXmlChars(); 

这将清除正则表达式中指定的chracters。 我从这个网站得到这个