为什么这个正则表达式允许使用脱字符(^)?

6 浏览
0 Comments

为什么这个正则表达式允许使用脱字符(^)?

这是一个用于匹配由17个字母、数字或连字符组成的字符串的正则表达式。字符串必须包含至少一个字母和一个数字。它可以匹配"ABCDF31U100027743",但不会匹配"AB$DF31U100027743"(以及几乎任何其他非字母数字字符)。然而,它似乎会允许"AB^DF31U100027743"。

0
0 Comments

为什么这个正则表达式允许使用插入符号?

这个问题的原因是,你的字符类[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}$

在我看来,为了避免这样的问题并缩短正则表达式,总是更安全地使用忽略大小写选项。

0
0 Comments

为什么这个正则表达式允许使用插入符号(^)?

正则表达式使用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: ^

这样我们就成功排除了插入符号(^)的匹配。

0
0 Comments

为什么这个正则表达式允许使用插入符号(caret)?

你允许了A-z(大写'A'到小写'z')。你没有提到你使用的是哪个正则表达式包,但并不一定清楚A-Z和a-z是否是连续的;它们之间可能还有其他字符。请尝试使用以下正则表达式代替:

^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$

在regexpal中,它似乎符合你的要求。

0