我想清理用户评论:
示例:
"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)", "");
,但它对我的第一个案例不起作用。
非常感谢你的帮助!
答案 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"