Соответствие регулярному выражению Java соответствует пробелам и непробельным символам 2 раза

Это шаблон и строка, которые я использую для сопоставления регулярных выражений Java. Мне нужно '/dev/sda6 72342MB 5013MB ' (т.е. пробел без пробела пробел без пробела) в одной группе.

String pattern = ".*\n(\\S+\\s+){2}(.*)";
String str = "Filesystem     1MB-blocks   Used Available Use% Mounted on\n" +
              "/dev/sda6         72342MB 5013MB   63655MB   8% /common";
Pattern r = Pattern.compile(pattern,  Pattern.DOTALL);
Matcher m = r.matcher(str);
System.out.println(m.group(1));

Но это не так, как ожидалось. Это соответствует

72342MB

вместо

/dev/sda6 72342MB

Кто-нибудь может сказать, где я ошибаюсь?

String pattern = ".*\n(\\S+\\s+\\S+).*"; и не забудьте вызвать if (m.matches()), прежде чем пытаться вызвать m.group(1)
Elliott Frisch 07.04.2019 07:42

Я бы также спросил, всегда ли строка, которую вы хотите сопоставить, начинается с /dev (или, по крайней мере, всегда начинается с /), и всегда ли две другие строки для сопоставления заканчиваются на [Bb].

markspace 07.04.2019 07:42

@markspace Мне нужно сопоставить пробельные символы без пробелов 2 раза, как abc 3 пробела def 3 пробела.

Aditya Jha 07.04.2019 07:43

@ElliottFrisch Ты уверен? Мне нужно сопоставить три вещи, а не две. "'/dev/sda6 72342MB 5013MB' in a single group"

markspace 07.04.2019 07:43

@markspace Я понимаю /dev/sda6 72342MB именно то, что OP сказал, что они хотели.

Elliott Frisch 07.04.2019 07:44

@markspace мой плохой, я отредактировал вопрос. Используя {2}, я не могу сгруппировать его? я знаю, что могу написать что-то вроде (\\S+\\s+\\S+\\s+)

Aditya Jha 07.04.2019 07:49

@ElliottFrisch Извините, я пропустил одну вещь. Это должен быть еще один набор символов пробела после 72342 МБ. Как я могу сделать это, используя нотацию {2}? я знаю, что добавление еще одного // сделает эту задачу. что-то вроде (\\S+\\s+){2}

Aditya Jha 07.04.2019 07:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде две проблемы.

  • Вам нужно всегда вызывать matches() или find() перед вызовом .group() методов на объекте сопоставления.
  • Во-вторых, ваше регулярное выражение неправильно сгруппировано.

В настоящее время ваша группа будет давать только одно/последнее совпадение, поэтому вместо этого вам нужно обернуть все ваше выражение в группу. Правильное регулярное выражение, которое вам нужно, это,

.*\n((?:\\S+\\s+){2})(.*)

Попробуйте эти коды Java,

String pattern = ".*\n((?:\\S+\\s+){2})(.*)";
String str = "Filesystem     1MB-blocks   Used Available Use% Mounted on\n" +
              "/dev/sda6         72342MB 5013MB   63655MB   8% /common";
Pattern r = Pattern.compile(pattern,  Pattern.DOTALL);
Matcher m = r.matcher(str);
if (m.matches()) {
    System.out.println(m.group(1));
}

Принты,

/dev/sda6         72342MB 

Спасибо не знал?: не вспомню недавно захваченную группу. и да, мне нужно было захватить все это. Спасибо.

Aditya Jha 07.04.2019 08:00
?: используется для создания шаблона группы без группировки, поскольку по умолчанию скобки всегда создают шаблон группировки. Приведенное выше регулярное выражение по-прежнему работало бы даже без ?: в регулярном выражении, но хорошей практикой является превращение любого шаблона группировки в шаблон без группировки, если они вам не нужны.
Pushpesh Kumar Rajwanshi 07.04.2019 08:12

Другие вопросы по теме