输入字符串:NNULL(EUR,VALUE)+SOMESTR
预期输出:NNULL(X,X)+X
尝试表达:
String str = "NNULL(EUR,VALUE)+SOMESTR";
str=str.replaceAll("[^(NNULL)\\+,]+","X");
输出获取:
NNULL(XUX,XLUX)+X
答案 0 :(得分:3)
您可以使用(
,,
或+
String str = "NNULL(EUR,VALUE)+SOMESTR";
str=str.replaceAll("(?<=[(,+])\\w+","X");
System.out.println(str); // NNULL(X,X)+X
答案 1 :(得分:1)
您如何想象会产生您想要的输出?
[...]
语法是一个字符类。它匹配单个字符。否定该类匹配不在类中的任何字符。因此,[^(NNULL)\\+,]
会匹配不属于(
,N
,U
等的每个字符。
看起来你想要做的是根据一组你没有明确定义的规则来标记字符串,然后替换某些标记。
首先,定义一个匹配单个'令牌'的简单正则表达式。根据您的问题,我猜您要考虑单词和符号,因此令牌将是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)[^(),+]+
\b # <word boundary>
(?! # Negative Look-Ahead
NNULL # "NNULL"
) # End of Negative Look-Ahead
[^(),+] # Character not in [(),+] Character Class
+ # (one or more)(greedy)