正则表达式问题:如何清除行首尾控制字符但保留换行符
解决移除行首行尾控制字符但保留换行符的正则问题
这个问题很常见——当你想用\p{C}匹配控制字符时,很容易不小心把换行符也卷进去,毕竟换行符确实属于\p{C}控制字符范畴。别担心,咱们调整一下正则就能精准实现你的需求:只移除每行首尾的非换行控制字符,保留所有换行符。
核心思路
我们需要重新定义要匹配的控制字符:属于\p{C}集合,但排除换行符\n。在正则里,可以用字符类交集[\\p{C}&&[^\\n]]来实现这个逻辑——意思是“所有控制字符,除了换行符”。
修改后的代码
把你原来的正则里的\\p{C}替换成上面的字符类即可:
String str = "Apple\n" + "\n" + "\n" + "\n" + "> --" + "\n" + "\n" + "Mango\n" + "\n" + "\n" + "Kiwi\n" + "Papaya\n" + "\n" + "Orange\n"; str = str.replaceAll("(?m)((^[\\p{C}&&[^\\n]]*)|([\\p{C}&&[^\\n]]*$))", "");
正则各部分解释
(?m):开启多行模式,让^和$匹配每一行的开头和结尾(而不是整个字符串的首尾),这是实现“行首行尾”处理的关键。^[\\p{C}&&[^\\n]]*:匹配行首连续的0个或多个“非换行控制字符”。[\\p{C}&&[^\\n]]*$:匹配行尾连续的0个或多个“非换行控制字符”。- 用
|把两种情况合并,替换成空字符串,就完美实现了你的需求:保留所有换行符,只清理每行首尾的其他控制字符。
扩展说明
如果你的场景里还需要保留回车符\r(比如Windows环境下的换行),只需要把字符类调整为[\\p{C}&&[^\\n\r]]即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Raqib
相关产品推荐
相关产品推荐

