我有这个字符串:

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字母,标点和符号。

10-04 12:00
查看更多