XML中无效字符的正则表达式

时间:2015-05-14 05:11:11

标签: regex xml

我试图找出一种可以在XML中找到所有无效字符的方法。 根据{{​​3}},这些是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中存在的无效字符。

1 个答案:

答案 0 :(得分:1)

首先,xml中允许使用文字文本&#3; - 不允许(如果列表正确)是带有ascii-code 3的字符。希望我做对了。

二。大多数正则表达式都允许搜索可以使用\x00(两个十六进制数字)和\u0000(4个十六进制数字)定义的字符。 有些口味允许像\x{...}这样的东西 - 但它有不同的味道......

我们从

开始

[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD]

[^]定义了一组否定的字符和字符范围(以及更多)。只需填写所有允许的字符和范围即可。

如果您的风味理解\x{},那么它很容易扩展。

[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\x{10000}-\x{10FFFF}]

否则你必须按字符搜索surrogate pairs个字符......

\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