Java 如何使用正则表达式替换新行开头的制表符?
我正在使用java尝试将新行开头的四个空格替换为一个选项卡。我想使用正则表达式来实现这一点。我的问题是,正则表达式目前正在用一个选项卡替换所有四个空格序列。我希望它为每个四个空格序列插入一个选项卡。现在我有:Java 如何使用正则表达式替换新行开头的制表符?,java,regex,Java,Regex,我正在使用java尝试将新行开头的四个空格替换为一个选项卡。我想使用正则表达式来实现这一点。我的问题是,正则表达式目前正在用一个选项卡替换所有四个空格序列。我希望它为每个四个空格序列插入一个选项卡。现在我有: public String translate(String text) { text = text.replaceAll("(?m)^( )+", "\t"); return text; } 这真的需要使用正则表达式吗?如果不是,我建议使用
public String translate(String text) {
text = text.replaceAll("(?m)^( )+", "\t");
return text;
}
这真的需要使用正则表达式吗?如果不是,我建议使用以下代码。它将用一个制表符(即每个序列一个制表符)替换行开始处的每一个四个空格序列,并且不会影响所有其他四个空格 与正则表达式不同,此代码即使对于大型文本块也能立即执行。
您不需要
+
,因为您只需要4个空格,并且需要一个look-behind断言:
text = text.replaceAll("(?m)(?<=^ *) ", "\t");
这似乎是不必要的复杂-1通常我不会因为糟糕的代码而否决一个答案,但这个答案是如此糟糕的解决方案,它应该得到100个否决票。仅仅因为它“有效”并不意味着它“好”——你可以在一行中做到这一点@波希米亚人:是的,你可以,但我认为这不是问题所在——你无论如何都要把它包装在一个函数中。然而,问题是rexeg的性能很差。尝试将字符串大小增加到50k个字符-我的解决方案可以立即工作,而目前提交的最佳正则表达式(即您的正则表达式)可以阻止整个世界。@Friented Spider:希望您理解
正好4个空格
和1个或更多空格
之间的区别。还有你自己的答案,该说什么。。我想波希米亚人很清楚地说明了它应该得到什么:)@anubhava我确实理解其中的区别,在我看来,我的代码示例正是这样做的。我不同意,基于正则表达式的答案比我的好——它简洁,但不切实际——但这不是由我来决定的。我希望这个答案至少对其他人有帮助。为(inti=0;I<10;++I){text+=text;}(文本长度将变为25k)添加,然后等待它完成。当您深入研究正则表达式时,您需要处理回溯、特定于引擎的错误等等,这需要深入了解开发、调试甚至理解。一行值得吗?@FrozenSpider你是对的-由于回溯问题,此解决方案仅适用于中等大小的输入(10K左右)。
text = text.replaceAll("(?m)(?<=^ *) ", "\t");
String text = " a\n b \n";
text = text.replaceAll("(?m)(?<=^ *) ", "\t");
System.out.println(text.replace("\t", "TAB"));
TABTABa
TABTABb