Java. Распарсить третье слово каждой строки через регулярные выражения
Имеются идентичные строки(String s), необходимо из каждой строки получить третье слово. Я написала регулярное выражение, оно работает, но выглядит отвратительно. Как можно записать его короче?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String type = "fruts";
String s = "5 orange fruts 49 200";
Pattern pattern = Pattern.compile("(\\d+)(\\s)(\\w+)(\\s)(\\w+)(\\s)(\\d+\\.\\d+|\\d+)(\\s)(\\d+)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
if (matcher.group(5).equalsIgnoreCase(type)) {
System.out.println(type);
}
}
}
}
Ответы (1 шт):
Автор решения: m. vokhm
→ Ссылка
- Вам не нужны первые четыре группы, так что все скобки перед нужным словом можно выбросить. Получится
"\\d+\\s\\w+\\s(\\w+)(\\s)(\\d+\\.\\d+|\\d+)(\\s)(\\d+)" - По условиям задачи вас не интересует, что идет после нужного слова. Значит, всё, что идет после первой группы, можно убрать. Останется
"\\d+\\s\\w+\\s(\\w+)". Это и будет нужная вам регулярка. - Ваше нежелание умножать сущности сверх необходимого весьма похвально, но сравните первый и второй фрагменты в приведенном ниже коде -- в каком из них больше сущностей? Какой из них можно назвать кодом с излишними сущностями? И, главное, какой легче для понимания? Легкость понимания кода важнее, чем количество сущностей в нём.
Вот код:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Ru_so_1279488_regexParsingString {
public static void main(String[] args) {
final String type = "fruts";
final String s = "5 orange fruts 49 200";
// Фрагмент 1
final Pattern pattern = Pattern.compile("\\d+\\s\\w+\\s(\\w+).*");
final Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
if (matcher.group(1).equalsIgnoreCase(type)) {
System.out.println(type);
}
}
// Фрагмент 2
final String[] strings = s.split(" ");
if (strings.length >= 3)
System.out.println(strings[2]);
}
}