gpt4 book ai didi

java - 正则表达式模式在不应该区分字母时?

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:09 27 4
gpt4 key购买 nike

我正在编写一个用于练习的简单用户名验证的正则表达式。虽然我确信这种模式可能还有其他问题,但如果有人能解释我遇到的这种看似奇怪的行为,我会很高兴。

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class userRegex{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while(testCases>0){
String username = in.nextLine();
String pattern = "([[:alpha:]])[a-zA-Z_]{7,29}";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(username);

if (m.find( )) {
System.out.println("Valid");
} else {
System.out.println("Invalid");
}
testCases--;
}
}
}

当我输入时:

2
dfhidbuffon
dfdidbuffon

编译器应该返回:

Valid
Valid

但相反,它返回

Valid
Invalid

为什么它会区分每个用户名中的第 3 个字母是“h”还是“d”?

编辑:添加了@Draco18s 和@ruakh 的建议,但是,我仍然遇到同样的奇怪行为。

最佳答案

[:alpha:] 没有您想要的特殊含义;相反,它最终只表示“任何字符 :ahlp”。所以 dfhidbuffon 包含一个匹配你的模式(即 h 加上 idbuffon),而 dfdidbuffon 没有。 (请注意,matcher.find() 会在 字符串中查找任何匹配项;如果您想专门匹配 整个 字符串,您应该使用matcher.matches(),或者您可以修改您的模式以使用 anchor ,例如 ^$。)

您可能会想到许多正则表达式实现中的符号,其中 [:alpha:] 表示“任何字母字符”;但首先,Java 的 Pattern 类不支持该表示法(向 ajb 指出这一点),其次,这些语言需要 [:alpha:] 出现在内部一个字符类中,例如作为 [[:alpha:]]。如果您只想匹配 ASCII 字母,则 Java 等效项是 \p{Alpha}[A-Za-z],而 \p{IsAlphabetic} 如果你想匹配任何 Unicode 字母。

关于java - 正则表达式模式在不应该区分字母时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com