你觉得你想要的输出会是怎样产生的?
[...] 语法是一个字符类。它匹配单个字符。否定类匹配任何不在类中的字符。所以[^(NNULL)\\+,] 匹配不是(、N、U 等的每个字符。
看来您要做的是根据您尚未明确定义的一组规则对字符串进行标记,然后替换某些标记。
首先,定义一个匹配单个“令牌”的简单正则表达式。根据您的问题,我猜您想考虑单词和符号,因此标记将是 NNULL、(、EUR、,、VALUE、)、+、@ 987654333@.
Pattern pattern = Pattern.compile("\\w+|\\W"); // a word, or a single non-word character
现在,找到一种方法来指定保留哪些标记以及替换哪些标记。我使用了一个包含“好”标记的 Set,但任何字符串谓词都可以。
Set<String> retain = new HashSet<>(Arrays.asList("NNULL", "(", ")", ",", "+"));
我们现在要做的就是遍历令牌(由正则表达式标识)并查看它们是否在“好”集中。
StringBuilder result = new StringBuilder();
Matcher m = pattern.matcher(input);
while(m.find()) {
String token = m.group();
result.append(retain.contains(token) ? token : "X");
}
有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。