Java:如何只用一个替换多个回车?

时间:2017-05-04 14:31:41

标签: java regex string

我想清理用户评论:

  • 删除所有重复的回车
  • 删除最后的所有回车

示例:

"Hello guys,
it's my example,



to try to clean


my comment
"

我想:

"Hello guys,
it's my example,

to try to clean

my comment"

我尝试使用s.replaceAll("(?:\\n|\\r)", "");,但它对我的第一个案例不起作用。

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:3)

这应该很简单:

s.replaceAll("[\n\r]{2,}","\n\n")

它将所有顺序回车(等于或大于2)替换为两个回车。

更新:@John Bollinger指出了非常好的事情:“......这种方法将单个Windows风格的行终止符转换为双重的Unix行终结符...”

所以可能更好,更通用的方法是:

s.replaceAll("(\n{2,})|(\r{2,})|((\r\n){2,})","\n\n")

UPDATE-2 :要删除主要回车符,请执行以下操作:.replaceAll("[\n\r]+$","")

答案 1 :(得分:1)

包括你留给另一个答案的comment,你想要做三件事:

  • 3个或更多的换行符应减少到2个,最多留下一个空行。

  • 应删除文字末尾的所有换行符。

  • 应删除行尾的空格。

如果你想在一个正则表达式中使用所有这些,那么它是:

replaceAll("(?:\\R|\\s)+$|[ \t]*(\\R)[ \t]*(\\R)(?:[ \t]*\\R)+", "$1$2")

该问题使用短语"回车",它在Java中是\r字符,但示例代码表明它实际上意味着"行分隔符",或者"换行符"正如它在正则表达式文档中调用的那样,\R regex pattern

  

任何Unicode换行序列,相当于
     \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

上面的正则表达式的第一部分((?:\\R|\\s)+$)用于最后消除所有(+)换行符(\R)和/或空格字符(\s)输入($)。

第二部分使用子模式[ \t]*\\R 3次。子模式匹配换行符和所有前一个空格。

要将子模式匹配3次或更多次,您通常会使用X{3,},但我们希望捕获前两个换行符,因此我们可以保留它们,而不知道它们是什么类型的换行符(例如Windows vs Linux),我们改为使用capture编写子模式两次,然后匹配1或更多。

最后,我们用两个捕获的换行符替换它。如果模式的第一部分匹配,那么它将被替换为空,即它被移除。如果第二部分匹配,则将其替换为前两个匹配的换行符,即保留那些行字符串。

答案 2 :(得分:-1)

另一种满足您要求的解决方案:

public static void main(String[] args) {
    String str =
            "\"Hello guys,\n" +
            "it's my example,\n" +
            "\n\r" +
            "\n" +
            "\n\r" +
            "to try to clean\n" +
            "\n\r" +
            "\n" +
            "my comment\n" +
            "\"";
    System.out.println("Before\n\n" + str);
    System.out.println("\n\nAfter:\n\n" + str
            .replaceAll("(\n|\n\r){3,}", "\n\n")
            .replaceAll("(\n|\n\r)+\"$", "\""));
}

<强>输出

Before

"Hello guys,
it's my example,



to try to clean


my comment
"


After:

"Hello guys,
it's my example,

to try to clean

my comment"