我正在使用java尝试将新行开头的四个空格替换为制表符。我想用正则表达式来做这件事。我的问题是正则表达式目前正在用一个标签替换所有四个空格序列。我希望它为每个四空间序列插入一个标签。现在我有:
public String translate(String text) {
text = text.replaceAll("(?m)^( )+", "\t");
return text;
}
答案 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