.net 为什么我的正则表达式失败了?

.net 为什么我的正则表达式失败了?,.net,regex,.net,Regex,我正在尝试创建一个正则表达式来验证xml实体名称是否有效(请参阅相关问题:) 基本上是验证第一个字符是否有效。但是,令牌[\xF8-\x2FF]正在轰炸正则表达式验证。知道为什么吗?我想不出来 更新 .net解析器正在抛出一个异常,该异常以相反顺序显示范围。因为\x2F是一个ASCII字符。它将[\xF8-\x2FF]视为\xF8-\x2F(无效范围)或字符F之间的匹配 对unicode使用\u:[\u00F8-\u02FF],因为\x2F是一个ASCII字符。它将[\xF8-\x2FF]视为\

我正在尝试创建一个正则表达式来验证xml实体名称是否有效(请参阅相关问题:)

基本上是验证第一个字符是否有效。但是,令牌
[\xF8-\x2FF]
正在轰炸正则表达式验证。知道为什么吗?我想不出来

更新

.net解析器正在抛出一个异常,该异常以相反顺序显示
范围。

因为
\x2F
是一个ASCII字符。它将
[\xF8-\x2FF]
视为
\xF8-\x2F
(无效范围)或字符
F
之间的匹配


对unicode使用
\u
[\u00F8-\u02FF]
,因为
\x2F
是一个ASCII字符。它将
[\xF8-\x2FF]
视为
\xF8-\x2F
(无效范围)或字符
F
之间的匹配


对unicode使用
\u
[\u00F8-\u02FF]
在正则表达式中,每个范围只能使用一个字符,并且大多数正则表达式解析器无法理解使用
\x
表示法的多个字节。改用
\u
符号

(:|[A-Z]|_|[a-z]|[\xC0-\xD6]|[\xD8-\xF6]|[\xF8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[\u10000-\uEFFFF])

\x20
使用 2位十六进制。在这种情况下,,
\x2-
表示一个空格

对于unicode:

\u0020
匹配Unicode字符 正好使用四个十六进制数字。 在这种情况下,
\u0020
是一个空格


因此,我使用了上述两种方法,
\x
表示2字符的十六进制值,而
\u
表示较大的十六进制值。

在正则表达式中,每个范围只能使用一个字符,大多数正则表达式解析器无法理解使用
\x
表示法的多个字节。改用
\u
符号

(:|[A-Z]|_|[a-z]|[\xC0-\xD6]|[\xD8-\xF6]|[\xF8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[\u10000-\uEFFFF])

\x20
使用 2位十六进制。在这种情况下,,
\x2-
表示一个空格

对于unicode:

\u0020
匹配Unicode字符 正好使用四个十六进制数字。 在这种情况下,
\u0020
是一个空格


因此,我使用了上述两种方法,
\x
用于2字符十六进制值,
\u
用于较大的值。

您使用了哪种正则表达式解析器?有几种,但这是我最常用的一种,我可以推荐吗?如果你使用了它,你会立即发现问题。只是一个注释,因为没有人提到它,
:|[a-Z]|[a-Z]
[:a-Z\u a-Z]
-你几乎可以放弃所有这些
]|[
并使用一个字符类。您使用了哪个正则表达式解析器?有几个,但这是我推荐的最常用的一个?如果您使用了它,您会立即发现问题。请注意,因为没有人提到它,
:|[a-Z]|[a-Z]
[:a-Z|a-Z]相同
-您可以几乎放弃所有这些
]|[
并使用一个字符类。实际上,上面的regex show n不起作用。我也尝试过。:)问题是,尝试一个ID,例如
I@
。它会通过。但这不是有效的XML ID(或NMTOKEN)令牌。问题在于
[\u10000-\uEFFFF]
在您的正则表达式中..NET正则表达式只接受UTF-16字符序列,
U+10000
的长度大于16位。应将字符类更改为使用UTF-16代理项对,如下所示:
([\uD800-\uDB7F][\uDC00-\uDFFF])
。这将通过
U+efff
匹配范围
U+10000
中的所有UTF字符。现在像
i@
这样的ID将不会验证。HTH。实际上,上面的regex show n不起作用。我也尝试过。:)问题是,尝试一个ID,例如
i@
。它会通过。但这不是有效的XML ID(或NMTOKEN)令牌。问题在于您的正则表达式中的
[\u10000-\uEFFFF]
..NET正则表达式仅接受UTF-16字符序列,并且
U+10000
长度大于16位。应将字符类更改为使用UTF-16代理项对,如下所示:
([\uD800-\uDB7F][\uDC00-\uDFFF])
。这将通过
U+efff
匹配范围
U+10000
中的所有UTF字符。现在像
i@
这样的ID将不会验证。HTH。