Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用正则表达式替换新行开头的制表符?_Java_Regex - Fatal编程技术网

Java 如何使用正则表达式替换新行开头的制表符?

Java 如何使用正则表达式替换新行开头的制表符?,java,regex,Java,Regex,我正在使用java尝试将新行开头的四个空格替换为一个选项卡。我想使用正则表达式来实现这一点。我的问题是,正则表达式目前正在用一个选项卡替换所有四个空格序列。我希望它为每个四个空格序列插入一个选项卡。现在我有: public String translate(String text) { text = text.replaceAll("(?m)^( )+", "\t"); return text; } 这真的需要使用正则表达式吗?如果不是,我建议使用

我正在使用java尝试将新行开头的四个空格替换为一个选项卡。我想使用正则表达式来实现这一点。我的问题是,正则表达式目前正在用一个选项卡替换所有四个空格序列。我希望它为每个四个空格序列插入一个选项卡。现在我有:

    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