XML无效字符的正则表达式

4
我正在尝试找到一种方法,可以查找XML中的所有无效字符。 根据W3建议,以下是XML中有效的字符:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

将其转换为十进制:

9
10
13
32-55295
57344-65533
65536-1114111

这些是有效的XML字符。

我正在尝试使用适当的正则表达式在Notepad++中搜索无效字符。

我的XML代码片段:

        <custom-attribute attribute-id="isContendFeed">fal &#11; se</custom-attribute>
        <custom-attribute attribute-id="pageNoFollow">fal &#3; se</custom-attribute>
        <custom-attribute attribute-id="pageNoIndex">fal &#13; se</custom-attribute>
        <custom-attribute attribute-id="rrRecommendable">false</custom-attribute>

从上面的例子中,我希望我的正则表达式能够找到&#11;&#3;,因为在XML中这些是不允许的。
我无法构建这个正则表达式。
我为数字范围制作的正则表达式:
32-55295 : (3[2-9]|[4-9][0-9]|[1-9][0-9]{2,3}|[1-4][0-9]{4}|5[0-4][0-9]{3}|55[01][0-9]{2}|552[0-8][0-9]|5529[0-5])
57344-65533 : (5734[4-9]|573[5-9][0-9]|57[4-9][0-9]{2}|5[89][0-9]{3}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-3])
65536-1114111 : (6(5(5(3[6-9]|[4-9][0-9])|[6-9][0-9]{2})|[6-9][0-9]{3})|[7-9][0-9]{4}|[1-9][0-9]{5}|1(0[0-9]{5}|1(0[0-9]{4}|1([0-3][0-9]{3}|4(0[0-9]{2}|1(0[0-9]|1[01])))))))

这些正则表达式单独使用时有效,但我无法构建完整的正则表达式。
除了正则表达式之外,还有其他方法可以查找无效字符吗?如果没有,请帮我构建一个可以在我的XML中查找无效字符的正则表达式。

你可以只需在其上启动一个验证工具,例如 xmllint - guido
我发现了一个Notepad++插件XMLTools,它可以满足我的需求。唯一的问题是它会逐个显示无效字符,而不是一次性全部显示。 - Vikas Mangal
你的意思是无效字符是数字 1-811,1214-3155296-5734365534,65535,以及任何大于 1114111 的数字吗? - Nader Hisham
@NaderHisham 不行。无效字符是指那些在你提到的数字中具有十进制代码的字符。请查看问题中的XML。请参阅此处。我只是将它们从十六进制转换为十进制。 - Vikas Mangal
1个回答

1
首先,在xml中允许使用文字文本&#3;,但ascii码为3的字符不允许(如果列表正确的话)。希望我理解得没错。
其次,大多数正则表达式支持使用\x00(两个十六进制数字)和\u0000(4个十六进制数字)来定义字符。某些正则表达式还支持类似\x{...}的语法,但具体实现因版本而异。
我们从以下内容开始: [^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD] [^]定义了一个反向字符集和字符范围(以及其他内容)。只需填入所有允许的字符和范围即可。
如果您的正则表达式支持\x{},那么扩展就很容易了。
[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\x{10000}-\x{10FFFF}]

否则,您必须逐个字符搜索代理对字符... \x {10000} \uD800\uDC00相同 \x {10FFFF} \uDBFF\uDFFF相同
这不能在单个集合中完成。不好玩;) 它有点像否定版本
[\uD800-\uDBFF][\uDC00-\uDFFF]|
[\uD800-\uDBFF](?![\uDC00-\uDFFF])|
(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]

(来自https://mathiasbynens.be/notes/javascript-unicode#matching-code-points


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接