在replaceAll中的正则表达式中使用NOT

时间:2019-02-08 12:46:46

标签: java regex

我有这个字符串:

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;

1 个答案:

答案 0 :(得分:3)

您所使用的环视是一种非消耗模式,即,由于将仅匹配字符串中的位置,因此匹配值将始终为空。使用

String b = a.replaceAll("\\P{Alnum}+", "");

\\P{Alnum}+模式匹配ASCII字母数字字符以外的一个或多个字符。另外,请参见Predefined Character classes

或者,您可以使用

String b = a.replaceAll("[^\\p{L}\\p{P}\\p{S}]+", "");

这将删除1个或更多字符的块,而不是Unicode字母,标点和符号。