Java 为什么这个正则表达式不能准确地检查?

Java 为什么这个正则表达式不能准确地检查?,java,regex,Java,Regex,我有下面的正则表达式方法,它对给定字符串分3个阶段进行匹配。但是由于某种原因,Regex无法检查某些内容。根据我通过工作获得的任何知识,它们似乎是正确的。有人能纠正我的错误吗 我有以下代码: public class App { public static void main(String[] args) { String identifier = "urn:abc:de:xyz:234567.1890123"; if (identi

我有下面的正则表达式方法,它对给定字符串分3个阶段进行匹配。但是由于某种原因,
Regex
无法检查某些内容。根据我通过工作获得的任何知识,它们似乎是正确的。有人能纠正我的错误吗

我有以下代码:

public class App {
    public static void main(String[] args) {
        String identifier = "urn:abc:de:xyz:234567.1890123";

        if (identifier.matches("^urn:abc:de:xyz:.*")) {
            System.out.println("Match ONE");

            if (identifier.matches("^urn:abc:de:xyz:[0-9]{6,12}.[0-9]{1,7}.*")) {
                System.out.println("Match TWO");

                if (identifier.matches("^urn:abc:de:xyz:[0-9]{6,12}.[a-zA-Z0-9.-_]{1,20}$")) {
                    System.out.println("Match Three");
                }
            }
        }

    }
}
理想情况下,此代码应该生成输出

Match ONE
Match TWO
Match Three
仅当标识符=“urn:abc:de:xyz:234567.1890123.abd12”时,但如果标识符与正则表达式不匹配,则它会提供相同的输出事件,例如以下输入:

"urn:abc:de:xyz:234567.1890123"
"urn:abc:de:xyz:234567.1890ANC"
"urn:abc:de:xyz:234567.1890123"
"urn:abc:de:xyz:234567.1890ACB.123"
我不明白为什么它允许在
之后使用字母数字字符,而且它也不关心第二个
之后的字符

我希望我的
Regex
检查字符串是否具有以下格式:

  • 字符串以
    urn:abc:de:xyz:
  • 然后它有数字[0-9],范围从6到12(
    234567
  • 然后是小数点
  • 然后它有数字[0-9],范围从1到7(
    1890123
  • 然后是小数点
  • 最后,它有字母数字字符和特殊字符,范围从1到20(ABC123.-\u 12)
  • 这是我的正则表达式的有效字符串:
    urn:abc:de:xyz:234567.1890123.ABC123.\u 12

    这对于我的正则表达式是无效的字符串,因为它忽略了第6点中的元素:
    urn:abc:de:xyz:234567.1890123

    对于我的正则表达式来说,这也是一个无效字符串,因为它忽略了第4点的元素(它有ABC而不是十进制数)。
    urn:abc:de:xyz:234567.1890ABC.ABC123.\u12
    正则表达式的这部分:

    • [0-9]{6,12}.[0-9]{1,7}
      匹配6到12位数字,后跟任何字符,后跟1到7位数字
    要匹配一个点,需要对其进行转义。试试这个:

    ^urn:abc:de:xyz:[0-9]{6,12}\.[0-9]{1,7}\.[a-zA-Z0-9\-_]{1,20}$
    

    这将与字符串末尾的任意数量的点alphanum匹配,例如:

    ^urn:abc:de:xyz:\d{6,12}\.\d{1,7}(?:\.[\w-]{1,20})+$
    

    请参阅<代码>不仅匹配点字符。它几乎匹配所有内容,因为
    在正则表达式中有特殊的含义。这就是为什么最后的
    *
    有效-它意味着(几乎)任何字符都有0次或更多次。@Sweeper我如何确保字符串中有
    和所需的字符?我如何修改我的
    regex
    匹配表达式来检查这些东西?@Boristespider感谢您的回复。我如何修改它,使其工作,并检查我需要的东西?我不知道你正在检查什么。。。你到底想匹配什么,你不想匹配什么?但是如果我转义
    字符,那么它不会检查是否有
    字符?@BATMAN_2008不,如果你转义它,它只会与点完全匹配。否则它将匹配任何非换行符。反斜杠点序列不匹配点。匹配点后,如果不需要再匹配点,可以将其从最后一个方括号中删除。是的,谢谢,这很有效:)