为什么正则表达式[a-zA-Z]{5}对于不匹配的字符串返回true



我定义了一个正则表达式来检查字符串是否只包含字母字符并且长度为5:

use regex::Regex;
fn main() {
let re = Regex::new("[a-zA-Z]{5}").unwrap();
println!("{}", re.is_match("this-shouldn't-return-true@"));
}

我使用的文本包含许多非法字符,并且长度超过5个字符,那么为什么会返回true呢?

您必须将其放入^...$中以匹配整个字符串,而不仅仅是部分:

use regex::Regex;
fn main() {
let re = Regex::new("^[a-zA-Z]{5}$").unwrap();
println!("{}", re.is_match("this-shouldn't-return-true@"));
}

游乐场。

如文件所述:

请注意^$锚的使用。在这个机箱中,每个表达式都在开头和结尾使用隐式.*?执行,这允许它在文本中的任何位置进行匹配。锚可以用于确保全文与表达式匹配。

您的模式返回true,因为它匹配任何连续的5个阿尔法字符,在您的情况下,它同时匹配"不应该"one_answers"返回"。

将正则表达式更改为:^[a-zA-Z]{5}$

^            start of string
[a-zA-Z]{5}  matches 5 alpha chars
$            end of string

只有当字符串的长度为5个字符,并且从开始到结束的所有字符都在a-z和a-z范围内时,这才会匹配字符串。

最新更新