关于Java:正则表达式 [A-z] and [a-zA-Z]的区别

Difference between regex [A-z] and [a-zA-Z]

我正在使用regex为只需要字母字符的文本框编写输入验证器。我想知道[A-z][a-zA-Z]是否等价,或者性能上是否存在差异。

我在搜索时一直在读《以东记》1(1),没有提到《以东记》1(0)。

我使用的是Java的EDCOX1 4。


[A-z]将匹配Az范围内的ASCII字符,而[a-zA-Z]将匹配Az范围内和Az范围内的ASCII字符。乍一看,这似乎是等效的——但是,如果您查看这个ASCII字符表,您将看到A-z包含其他几个字符。具体来说,他们是[\]^_`(你显然不想要)。


a-z匹配"a"到"z"a-z匹配"a"到"z"a-z匹配所有这些以及"z"和"a"之间的字符,它们是[]。^/`

请参阅http://www.asciitable.com/


看看ASCII表。您将看到在zA之间有一些字符,因此您将匹配比预期更多的字符。


当您查看ASCII表时,您将看到以下内容:

1
2
3
4
A = 65
Z = 90
a = 97
z = 122

因此,[A-z]将匹配65到122之间的每个字符。这包括这些字符(91 -> 97)以及:

1
 [\]^_`

这意味着[a-zA-Z]将只匹配字母表,没有注意到的字符


方括号创建了一个字符类,连字符是在两个提供的字符之间添加每个字符的简写。也就是说,[A-F]可以写成[ABCDEF]

字符类[A-z]将匹配这些字符之间的每个字符,在ASCII中,这些字符包括一些其他字符,如"["、""和"]"。

指定这两种情况的另一种方法是使用/i修饰符将正则表达式设置为不区分大小写。


看看ASCII图表(Java字符是基于什么):在Z和A之间有很多标点字符,即:

1
[\]^ _`