Java字符串处理:移除非单词字符时保留空格与撇号的问题
解决正则误删撇号的问题
你的问题出在正则表达式的范围定义上——[^\\p{L}]+只允许保留Unicode字母,而像O'Connor里的撇号'并不属于\p{L}(字母)范畴,所以会被当成非目标字符替换成空格。
要保留撇号和空格,同时移除数字、•这类非单词字符,你需要调整正则,把撇号和空格加入到允许保留的字符集合中,之后再处理可能出现的连续空格:
String a = "Graeme O'Connor Dasha Nicholls Claire N MacDermott1 • Julia K Catherine Bryant1 Josèô Gil2"; // 第一步:移除所有非字母、非撇号、非空格的字符,替换为空格 String b = a.replaceAll("[^\\p{L}'\\s]+", " "); // 第二步:合并连续的空格为单个空格 b = b.replaceAll("\\s+", " "); // 可选:去除首尾可能存在的空格 b = b.trim(); System.out.println("replaced: " + b);
运行这段代码后,你会得到期望的输出:
Graeme O'Connor Claire N MacDermott Julia K Catherine Bryant Josèô Gil
补充说明
如果你还需要保留其他常见的单词内符号(比如连字符-),只需要把它们添加到正则的允许集合里即可,比如:
// 允许保留字母、撇号、连字符、空格 b = a.replaceAll("[^\\p{L}'\\-\\s]+", " ");
内容的提问来源于stack exchange,提问作者user1631306
相关产品推荐
相关产品推荐

