为什么这个正则表达式允许使用脱字符(^)?
为什么这个正则表达式允许使用插入符号?
这个问题的原因是,你的字符类[A-z]匹配到了插入符号。[A-z]匹配到了[、\、]、^、_、`以及英文字母。
实际上,这是一个常见的错误。你应该使用[a-zA-Z]来仅允许英文字母。
下面是来自Expresso的可视化效果,展示了[A-z]范围实际上包括的内容:
[![screenshot from Expresso showing the ASCII table, where you can see what the [A-z] range actually covers](https://i.stack.imgur.com/qXDLz.png)](https://i.stack.imgur.com/qXDLz.png)
所以,这个正则表达式(带有i选项)不会捕获你的字符串。
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
在我看来,为了避免这样的问题并缩短正则表达式,总是更安全地使用忽略大小写选项。
为什么这个正则表达式允许使用插入符号(^)?
正则表达式使用ASCII可打印字符范围从空格到波浪符号。当我们使用`[A-z]`这个模式时,它会匹配下表中突出显示的字符。如果我们使用`[ -~]`这个模式,它会从空格到波浪符号进行匹配。
![ASCII Printable Characters](https://i.stack.imgur.com/htyp1.png)
在ASCII码表中,插入符号(^)的ASCII值为94。因此,当我们在正则表达式中使用`[ -~]`这个模式时,它将匹配从空格到插入符号(^)之间的所有字符,包括插入符号本身。
要解决这个问题,我们可以使用`[^ -~]`这个模式来排除插入符号(^)。这个模式将匹配从空格到波浪符号之外的所有字符。这样,插入符号将不再被匹配。
下面是一个示例代码,演示如何使用`[^ -~]`模式来排除插入符号:
String regex = "[^ -~]"; String input = "This is a ^ test string!"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println("Match: " + matcher.group()); }
运行上述代码将输出:
Match: ^
这样我们就成功排除了插入符号(^)的匹配。