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
  1. Вам не нужны первые четыре группы, так что все скобки перед нужным словом можно выбросить. Получится "\\d+\\s\\w+\\s(\\w+)(\\s)(\\d+\\.\\d+|\\d+)(\\s)(\\d+)"
  2. По условиям задачи вас не интересует, что идет после нужного слова. Значит, всё, что идет после первой группы, можно убрать. Останется "\\d+\\s\\w+\\s(\\w+)". Это и будет нужная вам регулярка.
  3. Ваше нежелание умножать сущности сверх необходимого весьма похвально, но сравните первый и второй фрагменты в приведенном ниже коде -- в каком из них больше сущностей? Какой из них можно назвать кодом с излишними сущностями? И, главное, какой легче для понимания? Легкость понимания кода важнее, чем количество сущностей в нём.

Вот код:

 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]);
  }
}
→ Ссылка