有效的XML字符列表是众所周知的,如规范所定义:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
我的问题是,通过使用Unicode常规类别,是否可以为此(或其反向)制作PCRE正则表达式而不实际对代码点进行硬编码.反向可能类似于[\ p {Cc}\p {Cs}\p {Cn}],除了不正确地覆盖换行符和制表符并错过其他一些无效字符.
我知道这不是你问题的答案,但在这里有所帮助:
正则表达式匹配有效的 XML字符:
[\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]
因此,要从XML中删除无效的字符,您可以执行类似的操作
// filters control characters but allows only properly-formed surrogate sequences private static Regex _invalidXMLChars = new Regex( @"(? /// removes any unusual unicode characters that can't be encoded into XML /// public static string RemoveInvalidXMLChars(string text) { if (string.IsNullOrEmpty(text)) return ""; return _invalidXMLChars.Replace(text, ""); }
我有我们的常驻正则表达式/ XML天才,他有4,400多个上升的帖子,检查一下,然后他签了名.
对于内部以UTF-16存储代码点的系统,通常使用代理对(xD800-xDFFF)用于0xFFFF以上的代码点,在这些系统中,您必须验证是否真的可以使用例如\ u12345,或者必须将其指定为代理对.(我刚发现在C#中你可以使用\ u1234(16位)和\ U00001234(32位))
据微软称, "W3C建议不允许在元素或属性名称中使用代理字符." 在搜索W3s网站时,我发现了可能感兴趣的C079和C078.
我在java中试过这个并且它有效:
private String filterContent(String content) { return content.replaceAll("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]", ""); }
谢谢杰夫.