Переформатирование исходного кода Java, вместо следующей строки используйте фигурные скобки в конце строки

Я пытался понять, как реализовать проблему (ссылка ниже), но я натыкаюсь на стену.

В основном мне нужно переформатировать исходный код, который использует фигурные скобки следующей строки в фигурные скобки конца строки. По какой-то причине преподаватель моего класса решил поместить эту задачу в главу «Строки», а не в главу «Текстовый ввод-вывод» (это примерно пятью главами позже).

String sourceString = new String(Files.readAllBytes(Paths.get("Test.txt")));
String formatted = sourceString.replaceAll("\\s\\{", "\\{");
System.out.println(formatted);

Так что это то, что у меня есть до сих пор. Когда я выполняю прогон, вывод такой же, как исходный файл. Я следовал этой проблеме и использовал найденную идиому для преобразования всего файла в строку, метод replaceAll остановился... замена.

Пока у меня все еще было настроено так

StringBuilder source = new StringBuilder();
    while(s.hasNext()){
        source.append(s.nextLine());
    }
    String sourceString = source.toString();
    String formatted = sourceString.replaceAll("\\)\\s*\\{", ") {");
    System.out.println(formatted);

вывод находится в одной строке. Я чувствую, что метод replaceAll вообще не используется. Я чувствую, что забываю что-то вопиюще очевидное.


person user3278117    schedule 04.04.2014    source источник
comment
Базовая проверка: добавляет ли nextLine возврат каретки или он автоматически отбрасывается? Если последнее, вам нужно добавить его самостоятельно.   -  person Jongware    schedule 05.04.2014
comment
Если я добавлю его с помощью s.nextLine() + \r, вывод станет таким же, как и в моей первой попытке (с использованием readAllBytes).   -  person user3278117    schedule 05.04.2014
comment
ваше регулярное выражение не работает с многострочными, для этого вам нужно Pattern.DOTALL   -  person guido    schedule 05.04.2014


Ответы (2)


Второй аргумент replaceAll() - это строка, а не регулярное выражение, поэтому нет необходимости экранировать там {.

Также добавьте + для обозначения одного или нескольких пробелов.

So:

sourceString.replaceAll("\\s+\\{", "{")
person wvdz    schedule 04.04.2014
comment
Я получаю недопустимую escape-последовательность, если использую только один символ \. - person user3278117; 05.04.2014
comment
Я вижу свою ошибку сейчас. Я не стал редактировать \( out и проверял только первую строку вывода, которая не содержала (. Я изменил ее на вашу строку, и теперь она работает. - person user3278117; 05.04.2014

Если вы хотите сделать это без использования replaceAll() и regex, попробуйте следующее:

    String nextLine = null;
    String currentLine = null;
    while (s.hasNext()) {
        currentLine = s.nextLine();
        if (currentLine.trim().endsWith(")")) {
            while(s.hasNext()){
                if((nextLine = s.nextLine()).trim().length() != 0){
                    break;
                }
            }

            if (nextLine.trim().equals("{")) {
                source.append(currentLine).append(" {").append("\n");
            } else {
                source.append(currentLine).append("\n");
            }

        } else {
            source.append(currentLine).append("\n");
        }
    }
person Braj    schedule 05.04.2014