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

时间:2016-07-30 13:57:27

标签: java regex regex-negation

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

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

尝试表达:

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

输出获取:

NNULL(XUX,XLUX)+X

3 个答案:

答案 0 :(得分:3)

您可以使用(,+

使用积极的外观

Regex101

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

答案 1 :(得分:1)

您如何想象会产生您想要的输出?

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

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

首先,定义一个匹配单个'令牌'的简单正则表达式。根据您的问题,我猜您要考虑单词和符号,因此令牌将是NNULL(EUR,VALUE)+X

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");
}

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

答案 2 :(得分:0)

您建议的模式[^NNULL]除了NNULL之外没有任何意义,它意味着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)