正则表达式如何修改以仅删除重复出现的标点符号及空格
解决方案
你现有正则[^ a-zA-z0-9]存在两个问题:一是A-z的写法会包含[、\等ASCII区间的非字母字符,应该改为A-Z;二是正则把所有标点都列为了要删除的字符,自然会清空全部标点。
调整后按三步执行替换即可满足需求:
- 第一步先过滤非法字符,将需要保留的标点(按你的测试用例为
,.?,可按需扩展)加入白名单,仅删除其他语言字符、不在白名单内的特殊符号 - 第二步对连续重复的同类型标点做去重,仅保留单个
- 第三步对连续重复的空格做去重,仅保留单个
完整代码示例(Java)
String test = new String("agagahh,,,mvf .... AJFKL ???"); // 第一步:过滤非白名单字符 String st = test.replaceAll("[^a-zA-Z0-9 ,.?]", ""); // 第二步:替换连续重复的标点为单个 st = st.replaceAll("([,.?])\\1+", "$1"); // 第三步:替换连续重复的空格为单个 st = st.replaceAll("\\s+", " "); System.out.println(st); // 输出结果:"agagahh,mvf . AJFKL ?"
扩展说明
如果需要保留更多标点(比如!、;等),只需要同步在第一步的白名单正则、第二步的标点匹配正则中添加对应字符即可,比如要保留感叹号,修改为:
- 过滤正则:
[^a-zA-Z0-9 ,.?!] - 标点去重正则:
([,.?!])\\1+
内容的提问来源于stack exchange,提问作者Alpharius
相关产品推荐
相关产品推荐

