为何replaceAll("\\p{P}", "")会移除换行符?\p{P}仅匹配标点
问题解答:为何
replaceAll("\\p{P}", "")会移除换行符? 首先明确:Java正则中的\p{P}仅匹配Unicode标点符号类(包含连接符、破折号、引号、括号、问号等),换行符\n属于控制字符类\p{Cc},并不在\p{P}的匹配范围内,所以理论上replaceAll("\\p{P}", "")不会移除换行符。
你遇到的换行符消失问题,大概率不是这个正则本身导致的,可能的原因包括:
- 代码中存在额外的字符串处理逻辑:比如后续调用了
replace("\n", "")、trim(),或者读取输入时用了readLine()自动丢弃换行符; - 测试输出的显示问题:控制台输出可能将换行符隐式合并,或者你查看结果时未正确识别换行;
- 输入字符串中的“换行”并非标准
\n:比如某些特殊排版符号被误当成换行,而这些符号恰好属于\p{P}匹配范围(这种情况极少)。
你可以运行以下测试代码验证:
public class TestPunctReplace { public static void main(String[] args) { String original = "1,2,3\n4.5\n6.7?8"; String result = original.replaceAll("\\p{P}", ""); System.out.println("处理后结果:"); System.out.println(result); // 打印字符编码,确认换行符是否存在 for (char c : result.toCharArray()) { System.out.printf("'%c' (0x%04X)%n", c, (int) c); } } }
执行后会输出带换行的结果:
123 45 678
同时打印的字符编码会显示\n(编码0x000A)依然存在。
如果你的结果确实是无换行的12345678,请检查代码中是否有其他修改字符串的操作,或者输入字符串的原始内容是否真的包含换行符。
内容的提问来源于stack exchange,提问作者DimaMsuVmk22
相关产品推荐
相关产品推荐

