Поиск определенной буквы в строке — не работает (Java)

#java #arrays #regex #string

#java #массивы #регулярное выражение #строка

Вопрос:

Я пытался найти определенную букву из строки, но у меня возникают ошибки. У меня есть массив, в котором хранится около 1000 строк, и для каждой я хочу найти первое целое число, второе целое число, конкретную букву и фактическое слово. Например, одна сохраненная строка может быть: «1-36 g: гуакамоле», в которой я хотел бы вернуть значения 1, 36, букву g и слово гуакамоле. До сих пор я нашел способы получить первые два числа, но не строки. Есть ли какой-либо способ искать их по их индексу или их относительному положению к разделителям? Вот мой код на данный момент:

 for (int x = 0; x < list.length; x  ) { // For each stored string, check...
                    
    current = list[x]; // First, set current variable to current word from array
                    
    Matcher first = Pattern.compile("\d ").matcher(current);
    first.find();
    min = Integer.valueOf(first.group()); // Get minimum value (from example, 1)

    first.find();
    max = Integer.valueOf(first.group()); // Get maximum value (from example, 36)
                    
    first.find();
    letter = String.valueOf(first.group()); // What I am trying to do to get first letter (from example, g)
                    
    System.out.println("Minimum value: "   min   " | Maximum value: "   max   " | Letter: "   letter);
                    
}
 

Все, что появляется в консоли, — это следующая ошибка: Exception in thread "main" java.lang.IllegalStateException: No match found

Я еще не получил никакого кода, чтобы найти слово, которое я попробую следующим. Если бы кто-нибудь мог мне помочь и с этим, это было бы здорово!

В качестве альтернативы, если бы вы могли порекомендовать другой способ поиска этих значений в каждой строке, это также было бы очень ценно. Если я должен предоставить какой-либо другой код, пожалуйста, дайте мне знать. Заранее спасибо!

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

1. Почему бы вам не захватить все сразу? Скажем, с "(\d )-(\d )\s*(\p{Alpha} )\s*:\s*(.*)" помощью? См. ideone.com/JSUrUZ

Ответ №1:

Я просто запускаю это в regex101, пытался сопоставить с 1-36 g: guacamole, это работает для меня

 (d).(d ).(.*)s(w )
 

источник: https://regex101.com /

Ответ №2:

 Pattern recordPattern = Pattern.compile(".*(\d ).*(\d ) (.)\: (.*)$").matcher(current);
for (String record : list) { // For each stored string, check...
    Matcher m = recordPattern.matcher(current);
    if (m.matches()) {
        int min = Integer.parseInt(m.group(1));
        int max = Integer.parseInt(m.group(2)); 
        String letter = m.group(2);
        String name = m.group(3);
                    
        System.out.printf("Minimum: %d | Maximum: %d | Letter: %s | Name: %s.%n",
              min, max, letter, name);
    }               
}
 

Вместо поиска можно сопоставить всю строку. Всегда проверяйте результаты find соответственно. match так как в противном случае группы сопоставления недействительны.

Чтобы сделать код более читаемым, объявите переменную непосредственно перед использованием. В циклах нет штрафа (только один слот переменной в стеке вызовов). (Я знаю, что в начале CS считалось хорошим стилем объявлять все переменные вверху.)

Ошибка заключалась в регулярном "\d " выражении, которое обозначает 1 или более d igits. javadoc класса Pattern