我有这个字符串:
String a = "$$bar$55^$$";
我要删除所有符号。我做正则表达式:
String b = a.replaceAll("(?<=[^[\\p{Alpha}][\\p{Digit}]])", "");
但是,我得到:
$$bar$55^$$
但是我想得到这个字符串:
bar55
我究竟做错了什么?如何过滤除字母和数字以外的所有字符?
在
Oracle
中对我有用:select regexp_replace('$$bar$55^$$','[^[:alpha:][:digit:]]*') from dual;
最佳答案
您所使用的环视是一种非消耗性模式,即,由于仅会匹配字符串中的某个位置,因此匹配值将始终为空。采用
String b = a.replaceAll("\\P{Alnum}+", "");
\\P{Alnum}+
模式匹配ASCII字母数字字符以外的一个或多个字符。另请参见Predefined Character classes。或者,您可以使用
String b = a.replaceAll("[^\\p{L}\\p{P}\\p{S}]+", "");
这将删除1个或更多字符的块,而不是Unicode字母,标点和符号。