Java中如何移除字符串非字母数字字符仅保留数字间小数点
字符串处理问题:仅保留数字间的小数分隔点
问题场景
现有包含小数点的字符串,需要移除所有非字母数字字符,仅保留数字之间作为小数分隔符的句点,同时合并清理多余空格。
测试用原始字符串:String toPharse = "the. book - cost 7.55 dollars.";
原有问题代码
String newPharse = toPharse.replaceAll("[^A-Za-zd.0-9 ]", " ").replaceAll("\\s+", " ");
原有代码运行输出:"the. book cost 7.55 dollars."
该输出不符合预期,残留了两个非小数用途的普通句点:the后的句点、dollars后的句尾句点。
期望输出
"the book cost 7.55 dollars"
实现方案
分三步做正则替换即可得到目标结果:
- 第一步:匹配所有非小数分隔符的普通句点,替换为空格。使用正则
(?<!\\d)\\.|\\.(?!\\d),该正则会匹配两种不符合小数格式的句点:- 前侧没有相邻数字的句点
- 后侧没有相邻数字的句点
- 第二步:将剩余所有非字母、非数字、非空格的特殊字符全部替换为空格
- 第三步:将连续的多个空格合并为单个空格,最后去除字符串首尾的空格
完整可运行代码:
public class StringCleanExample { public static void main(String[] args) { String toPharse = "the. book - cost 7.55 dollars."; // 移除非小数用途的普通句点 String temp1 = toPharse.replaceAll("(?<!\\d)\\.|\\.(?!\\d)", " "); // 移除其余特殊字符 String temp2 = temp1.replaceAll("[^A-Za-z0-9 ]", " "); // 合并空格、去除首尾空格 String finalResult = temp2.replaceAll("\\s+", " ").trim(); System.out.println(finalResult); // 控制台输出:the book cost 7.55 dollars } }
注:原有代码的正则中存在笔误,
[A-Za-zd.0-9 ]里a-z后多写了一个多余的d,修正后不会影响正常字母匹配。
内容的提问来源于stack exchange,提问作者userit1985
相关产品推荐
相关产品推荐

