Как заменить вкладки в начале новой строки с помощью регулярных выражений? - PullRequest
2 голосов
/ 09 декабря 2011

Я использую Java, чтобы попытаться заменить четыре пробела в начале новой строки на вкладке. Я хотел бы сделать это с помощью регулярных выражений. Моя проблема в том, что регулярное выражение в настоящее время заменяет все последовательности из четырех пространств одной вкладкой. Я хочу, чтобы он вставил вкладку для каждой последовательности четырех пробелов. Прямо сейчас у меня есть:

    public String translate(String text) {
        text = text.replaceAll("(?m)^(    )+", "\t");
        return text;
}

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вы не хотите +, потому что вы хотите в точности 4 пробела, и вам нужно обратное утверждение:

text = text.replaceAll("(?m)(?<=^ *)    ", "\t");

Примечание: это следует использовать толькодля ввода около 10K или меньше из-за возврата назад, требуемого взглядом позади.Для большего ввода используйте шаблон и сопоставление и т. Д.

В отличие от других ответов, этот на самом деле работает (см. Тест ниже), поскольку он использует положительный взгляд (?<=^ *), чтобы утверждать, что между пробелами находятся только пробелы.начало ввода и замена цели, без которой вы будете сопоставлять только первый 4 пробела:

String text = "        a\n        b    \n";
text = text.replaceAll("(?m)(?<=^ *)    ", "\t");
System.out.println(text.replace("\t", "TAB"));

Выход:

TABTABa
TABTABb   
2 голосов
/ 09 декабря 2011

Действительно ли для этого нужно использовать регулярные выражения?Если нет, я предлагаю следующий код.Он заменит каждую последовательность из 4 пробелов в начале строки на вкладку (то есть одну вкладку на последовательность) и не повлияет на все остальные 4 пробела.

В отличие от регулярных выражений, этот код работает мгновенно даже для большого текстового блока.

String text = "    4    spaces\n        four    more\n    \n text";
String[] split = text.split("\n");
StringBuilder result = new StringBuilder(text.length());
for (String string : split) {
    int idx = 0;
    while (true) {
        String temp = string.substring(idx);
        if (temp.startsWith("    ")) {
            // Append a tab and push actual start index further
            result.append('\t');
            idx = idx + 4;
        } else {
            result.append(temp);
            break;
        }
    }
    result.append('\n');
}
System.out.println(text);
System.out.println("====");
System.out.println(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...