Java 正则表达式替换除少数字符组合之外的所有字符

Java regex replacing all the characters except few combination of characters

输入字符串:NNULL(EUR,VALUE)+SOMESTR

预期输出:NNULL(X,X)+X

尝试过的表达式:

String str = "NNULL(EUR,VALUE)+SOMESTR";
str=str.replaceAll("[^(NNULL)\+,]+","X");

输出获取:

NNULL(XUX,XLUX)+X

您可以使用 (,+

Regex101

String str = "NNULL(EUR,VALUE)+SOMESTR";
str=str.replaceAll("(?<=[(,+])\w+","X");
System.out.println(str); // NNULL(X,X)+X 

您如何想象您想要的输出结果?

[...]语法是一个字符class。它匹配单个字符。否定 class 匹配不在 class 中的任何字符。所以 [^(NNULL)\+,] 匹配不属于 (NU 等的每个字符

看起来你想做的是根据一组你没有明确定义的规则对字符串进行标记,然后替换某些标记。

首先,定义一个简单的正则表达式来匹配单个 'token'。根据你的问题,我猜你想考虑单词和符号,所以标记将是 NNULL(EUR,VALUE , ), +, X.

Pattern pattern = Pattern.compile("\w+|\W"); // a word, or a single non-word character

现在,找到一种方法来指定要保留和替换的令牌。我使用了一个包含 'good' 标记的集合,但任何字符串谓词都可以工作。

Set<String> retain = new HashSet<>(Arrays.asList("NNULL", "(", ")", ",", "+"));

我们现在要做的就是遍历标记(由正则表达式标识)并查看它们是否在 'good' 集合中。

StringBuilder result = new StringBuilder();
Matcher m = pattern.matcher(input);
while(m.find()) {
    String token = m.group();
    result.append(retain.contains(token) ? token : "X");
}

有的人遇到问题的时候会想"I know, I'll use regular expressions."现在有两个问题

你建议的模式 [^NNULL] 除了 NNULL 之外没有任何意义,它意味着任何不在字符 class NNULL 中的任何东西, N 在这里重复.

改为使用此模式

\b(?!NNULL)[^(),+]+

Demo

\b              # <word boundary>
(?!             # Negative Look-Ahead
  NNULL         # "NNULL"
)               # End of Negative Look-Ahead
[^(),+]         # Character not in [(),+] Character Class
+               # (one or more)(greedy)