В Java у меня есть эта строка:
uk\learningAid\UserInputs\UserClass.java:16: error: cannot find symbol
player.mvRight(3);
Я использую это регулярное выражение для соответствия 16
и cannot find symbol
:
Pattern pattern = Pattern.compile(":(\\d+):\\serror:\\s(.*)");
Однако я хочу также player.mvRight(3);
который находится на новой линии. Как мне это сделать?
Я попытался добавить этот \\n(.*)
В конец reex, но он ничего не смог сопоставить.
Чтобы совместить в том числе новую строку до первой ";".
Pattern pattern = Pattern.compile(":(\\d)+:\\serror:\\s(.*)\\n(.*);");
В соответствии с вашими комментариями, если это необязательно должно быть регулярным выражением, тогда методы String
такие как substring()
и indexof()
могут использоваться для получения позиции определенных символов и использовать их как маркеры для любых строк с определенным шаблоном, Ниже SSCCE должен работать для вашей String
и любого подобного формата.
public class Test {
public static void main(String[] args) {
String toProcess = "uk\\learningAid\\UserInputs\\UserClass.java:16: error: cannot find symbol \nplayer.mvRight(3);";
int firstCol = toProcess.indexOf(":");
int secondCol = toProcess.indexOf(":", firstCol+1);
int lastCol = toProcess.lastIndexOf(":");
System.out.println(toProcess.substring(firstCol+1, secondCol) + toProcess.substring(lastCol+1));
}
}
Вывод:
16 cannot find symbol
player.mvRight(3);
Кроме того, если вы хотите удалить разрыв строки, вы можете просто вызвать toProcess = toProcess.replaceAll("\n", "");
в начале удалить разрывы строк.
\s
, вероятно, является плохой идеей в приведенном выше примере, так как это будет соответствовать любому символу пробела, а не только обычным пробелам. Учитывая ввод, это будет иметь больше смысла вместо этого:::(\\d)+: error: (.*)\\n(.*);