#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