我试图找出一种可以在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  se</custom-attribute>
<custom-attribute attribute-id="pageNoFollow">fal  se</custom-attribute>
<custom-attribute attribute-id="pageNoIndex">fal se</custom-attribute>
<custom-attribute attribute-id="rrRecommendable">false</custom-attribute>
从上面的示例中,我希望我的正则表达式能够找到
和
,因为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中存在的无效字符。
答案 0 :(得分:1)
首先,xml中允许使用文字文本
- 不允许(如果列表正确)是带有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)