如何使用正则表达式替换新行开头的选项卡?

时间:2011-12-09 04:04:31

标签: java regex

我正在使用java尝试将新行开头的四个空格替换为制表符。我想用正则表达式来做这件事。我的问题是正则表达式目前正在用一个标签替换所有四个空格序列。我希望它为每个四空间序列插入一个标签。现在我有:

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

2 个答案:

答案 0 :(得分:2)

是否真的有必要使用正则表达式?如果没有,我建议以下代码。它将用一个标签(即每个序列一个标签)替换每行 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);

答案 1 :(得分:2)

您不希望+,因为您希望完全 4个空格,并且您需要一个后视断言:

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

注意:由于后面所需的回溯,这只应用于大约10K或更少的输入。对于较大的输入,请使用模式和匹配器等

与其他答案不同,这个答案实际上是有效的(参见下面的测试),因为它使用正面的后视(?<=^ *)断言只有空格位于输入的开始和目标替换之间,没有它'll只匹配第一个 4个空格:

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

输出:

TABTABa
TABTABb