Это шаблон и строка, которые я использую для сопоставления регулярных выражений 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
Кто-нибудь может сказать, где я ошибаюсь?
Я бы также спросил, всегда ли строка, которую вы хотите сопоставить, начинается с /dev
(или, по крайней мере, всегда начинается с /
), и всегда ли две другие строки для сопоставления заканчиваются на [Bb]
.
@markspace Мне нужно сопоставить пробельные символы без пробелов 2 раза, как abc 3 пробела def 3 пробела.
@ElliottFrisch Ты уверен? Мне нужно сопоставить три вещи, а не две. "'/dev/sda6 72342MB 5013MB' in a single group"
@markspace Я понимаю /dev/sda6 72342MB
именно то, что OP сказал, что они хотели.
@markspace мой плохой, я отредактировал вопрос. Используя {2}, я не могу сгруппировать его? я знаю, что могу написать что-то вроде (\\S+\\s+\\S+\\s+)
@ElliottFrisch Извините, я пропустил одну вещь. Это должен быть еще один набор символов пробела после 72342 МБ. Как я могу сделать это, используя нотацию {2}? я знаю, что добавление еще одного // сделает эту задачу. что-то вроде (\\S+\\s+){2}
В вашем коде две проблемы.
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
Спасибо не знал?: не вспомню недавно захваченную группу. и да, мне нужно было захватить все это. Спасибо.
?:
используется для создания шаблона группы без группировки, поскольку по умолчанию скобки всегда создают шаблон группировки. Приведенное выше регулярное выражение по-прежнему работало бы даже без ?:
в регулярном выражении, но хорошей практикой является превращение любого шаблона группировки в шаблон без группировки, если они вам не нужны.
String pattern = ".*\n(\\S+\\s+\\S+).*";
и не забудьте вызватьif (m.matches())
, прежде чем пытаться вызватьm.group(1)