Java 正则表达式匹配17个大写字符

Java 正则表达式匹配17个大写字符,java,regex,Java,Regex,在java中,哪个正则表达式更适合匹配一个长度为17个字符、全大写且不包含字母I(I)、O(O)或Q(Q)的字符串 我尝试了以下方法,但它仍然匹配I、O和Q(包括I、O和Q),甚至大于或小于17 ^[A-Z]+ 我如何改进这一点 ^(?!.*(?:[IOQ]))[A-Z]{17}$ 只需添加一个lookahead。请参阅演示 您的方法有三个问题: 您正在匹配任何大写英文字符。要解决此问题,您需要将[A-Z]替换为[A-HJ-NPR-Z]。这应该从A到H,从J到N,字母P,从R到Z 第二个问题

在java中,哪个正则表达式更适合匹配一个长度为17个字符、全大写且不包含字母I(I)、O(O)或Q(Q)的字符串

我尝试了以下方法,但它仍然匹配I、O和Q(包括I、O和Q),甚至大于或小于17

^[A-Z]+
我如何改进这一点

^(?!.*(?:[IOQ]))[A-Z]{17}$
只需添加一个
lookahead
。请参阅演示


您的方法有三个问题:

  • 您正在匹配任何大写英文字符。要解决此问题,您需要将
    [A-Z]
    替换为
    [A-HJ-NPR-Z]
    。这应该从
    A
    H
    ,从
    J
    N
    ,字母
    P
    ,从
    R
    Z

  • 第二个问题是您正在匹配一个或多个(由于
    +
    )。要精确匹配17个字符,
    +
    需要变成
    {17}

  • 步骤1和2将简单地匹配任何包含17个大写字母且在规定范围内的字符串。要确保字符串不包含任何其他内容,请在表达式的开头添加
    ^
    ,在表达式的结尾添加
    $
    。这将确保字符串不是由任何其他材料制成的


  • 因此,您的表达式应该如下所示:
    ^[a-HJ-NPR-Z]{17}$
    。正则表达式的示例可用。

    可以使用序列中带消去的量词来比较大写字符串。如果我们在Matcher类中使用matches方法,为了限制字符数,它将检查下面的确切序列

        String upperCaseString = new String("ABCDEABCDEABCDEAE");
        System.out.println("value is " + Pattern.compile("([A-Z&&[^IOQ]]){17}").matcher(upperCaseString).matches());
    

    谢谢,但这是否正好匹配17个字符?在java中?@nmvictor是的,它将匹配
    17
    ,在java中,您应该声明最后的正则表达式是
    ^[A-HJ-NPR-Z]{17}$