Разбор регулярных выражений с помощью регулярных выражений

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть шаблон [a-z0-9]{9}|[a-z0-9]{11}

Здесь я должен проанализировать это регулярное выражение, чтобы получить 9 и 11 для будущего сообщения о том, что «вам нужно ввести 9 или 11 символов»

Также у меня есть регулярное выражение, подобное

[a-z0-9]{9}

[a-z0-9]{9,}

[a-z0-9]{9,11}

Мне нужно написать какой-то метод, который может анализировать все эти строки, чтобы получить количество доступных символов.

Я сделал

Pattern.compile(".*\{(\d )(,?)(\d*)\}(\|.*\{(\d )\})?");

Он находит только последнее число в моем первом шаблоне. Но другие не распознают.

Как проверить все строки?

Upd: я не могу понять, но в Java первый шаблон из ответа {(d )(?:,(d*))?} не совпадает, но найдите 3 мои строки. Но первая и самая длинная строка, которую он не находит.

Чем отличаются совпадения и поиск? И почему этот шаблон может находить совпадения в web, но не в Java? И иногда я делаю matcher.find(); // return 2 matcher.group(1); // No match found exception

Ответ №1:

Это регулярное выражение должно работать для вас : [^\](?:\\)*{(d )(?:,(d*))?} .

Часть [^\](?:\\)* посвящена случаю экранирования косой черты.

Ниже приведен пример кода Java:

 public static void main(String[] args) {
    Pattern p = Pattern.compile("[^\\](?:\\\\)*\{(\d )(?:,(\d*))?\}");
    String testInput = "[a-z0-9]{1,2}|[a-z0-9]{3,}|[a-z0-9]{4}";
    Matcher matcher = p.matcher(testInput);
    while (matcher.find()){
        System.out.println("Next matching found:");
        if(matcher.group(2) == null){
            System.out.println("Strict: "   matcher.group(1));
        }else {
            System.out.println("Min: "
                      matcher.group(1)
                      ", Max: "
                      ("".equals(matcher.group(2)) ? "Infinte" : matcher.group(2)));
        }
    }
}
  

Вывод:

 Next matching found:
Min: 1, Max: 2
Next matching found:
Min: 3, Max: Infinte
Next matching found:
Strict: 4
  

Комментарии:

1. Спасибо за ваши попытки, но оба варианта оказались неудачными. Да, я проверил их по предоставленной вами ссылке, но в Java это не работает ((( И, кстати, что это значит?: Это жадный квантификатор? Если я выберу? — это означает 0/1 раз, но что это значит?:

2. Проверьте обновление… Конструкция, подобная (?:) группе без захвата, т. Е. Группе, Которую вы не хотели бы анализировать, а скорее для использования только как часть вашего правила.

3. Зачем нужна эта часть [^\\](?:\\\\) ?

4. потому что в вашем выражении могут быть косые черты в качестве управляющих символов. Поскольку косая черта может использоваться для экранирования косых черт, эта часть используется для проверки, { экранируется { ли она или является частью более широкой картины, например \{ , где { определяется квантификатор литерала «.

5. Я бы никогда не подумал об этом 🙂 и даже после вашего объяснения я с трудом это понимаю) но спасибо