Java 乌托邦标识号-正则表达式模式匹配

Java 乌托邦标识号-正则表达式模式匹配,java,regex,validation,Java,Regex,Validation,我试图使用java正则表达式类(即模式和匹配器)验证乌托邦ID号 以下是需要满足的条件: 字符串必须以0-3个小写字母(含0-3个)开头。 紧跟字母之后,必须有一系列数字0-9,该段的长度必须介于2和8之间(包括2和8)。 紧跟数字之后,必须至少有3个大写字母。 下面是我写的代码 public class Solution{public static void main(String[] args) { BufferedReader br = new BufferedR

我试图使用java正则表达式类(即模式和匹配器)验证乌托邦ID号

以下是需要满足的条件:

字符串必须以0-3个小写字母(含0-3个)开头。 紧跟字母之后,必须有一系列数字0-9,该段的长度必须介于2和8之间(包括2和8)。 紧跟数字之后,必须至少有3个大写字母。 下面是我写的代码

    public class Solution{public static void main(String[] args) {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int ntc;
        String[] str;
        try {
            ntc = Integer.parseInt(br.readLine());
            str = new String[ntc];
            for (int i = 0; i < ntc; i++)
                str[i] = br.readLine();
            for (int i = 0; i < ntc; i++)
                if (validate(str[i]))
                    System.out.println("VALID");
                else
                    System.out.println("INVALID");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static boolean validate(String str) {
        Pattern pr = Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");
        Matcher mr = pr.matcher(str);
        return mr.find();
    }}
以下是输入及其相应的o/p

I/p: 三,

N761512618TUKEFQROSWNWFWEWEQEXKPWYCRK

rRf99

198Vlhjiyvebodqcqegegocgrmqpe

O/p:

有效的

无效的

有效的

第一个测试用例无效,因为它有九个数字,而不是最多八个。但它说的是有效的。
我写的正则表达式模式有什么错误吗?

在正则表达式中使用开始和结束锚,以便进行精确的字符串匹配

Pattern pr = Pattern.compile("^[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}$");
如果没有锚,它也会从字符串的中间匹配。

使用而不是,以便将regexp与整个字符串匹配:

private static boolean validate(String str) {
    Pattern pr = Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");
    Matcher mr = pr.matcher(str);
    return mr.matches();
}
此外,由于模式从未更改,我会将其移动到常量中,这样就不会在每次调用该方法时重新编译它:

static final Pattern UTOPIAN_ID_PATTERN =
        Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");

private static boolean validate(final String str) {
    Matcher mr = UTOPIAN_ID_PATTERN.matcher(str);
    return mr.matches();
}