Java字符串去标点问题:单引号无法被\\p{Punct}匹配
解决方案:移除字符串中的标点(含单引号)
首先,你踩了Java字符串的经典坑——String是不可变对象:replaceAll()方法不会修改原line变量,而是返回一个全新的字符串对象。你必须把这个返回值赋值给变量,才能看到修改后的结果。
其次关于\p{Punct}的疑问:Java正则里的\p{Punct}确实包含ASCII单引号(',U+0027),你的例子里的单引号本应该被匹配到。但如果后续遇到特殊单引号(比如排版用的智能引号’),可以用更宽泛的\p{P}来匹配所有Unicode标点符号类,确保覆盖所有情况。
正确代码示例
String line = "there's, isn't"; String result = line.replaceAll("\\p{Punct}", ""); System.out.println(result); // 输出:theres isnt
如果想要更直观地确保单引号被覆盖,也可以显式把单引号加入正则(其实没必要,但适合理解):
String result = line.replaceAll("[\\p{Punct}']", "");
关键知识点提醒
- Java中所有String操作方法(比如
replace、substring等)都不会修改原字符串,必须接收返回值才能获取修改后的结果。 \p{Punct}在Java正则中的定义是:所有ASCII标点符号,包括! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _{ | } ~`这些字符。- 如果需要处理非ASCII标点(比如中文标点、智能引号),用
\p{P}可以匹配所有Unicode标点符号类。
内容的提问来源于stack exchange,提问作者Sohbet
相关产品推荐
相关产品推荐

