У меня есть следующий метод регулярного выражения, который выполняет совпадения в 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

Только когда identifier = "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 проверил, что строка имеет следующий формат:

  1. Строка начинается с urn:abc:de:xyz:
  2. Затем идут числа [0-9], которые варьируются от 6 до 12 (234567).
  3. Тогда в нем есть десятичная точка .
  4. Затем в нем есть числа [0-9], которые варьируются от 1 до 7 (1890123)
  5. Тогда у него есть десятичная точка ..
  6. Наконец, он имеет буквенно-цифровой символ и специальный символ в диапазоне от 1 до 20 (ABC123.-_ 12).

Это допустимая строка для моего регулярного выражения: urn:abc:de:xyz:234567.1890123.ABC123.-_12

Это недопустимая строка для моего регулярного выражения, поскольку в ней отсутствуют элементы из пункта 6: urn:abc:de:xyz:234567.1890123

Это также недопустимая строка для моего регулярного выражения, поскольку в ней отсутствуют элементы из пункта 4 (вместо десятичных чисел в ней есть ABC). urn:abc:de:xyz:234567.1890ABC.ABC123.-_12

1
BATMAN_2008 6 Фев 2021 в 11:33

1 ответ

Это будет соответствовать любому количеству букв с точками в конце строки, как ваши примеры:

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

Демо и объяснение

0
Toto 6 Фев 2021 в 11:41
66074965