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