【问题标题】:Java regex replacing all the characters except few combination of charactersJava正则表达式替换除少数字符组合外的所有字符
【发布时间】:2016-07-30 13:57:26
【问题描述】:

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

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

表达式尝试:

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

输出获取:

NNULL(XUX,XLUX)+X

【问题讨论】:

  • 抱歉,我不清楚您的问题。你能解释一下你试图实现的逻辑吗?你想通过[^(NNULL)\\+,] 实现什么?输入字符串有什么规律(我们可以做出什么假设)?

标签: java regex regex-negation


【解决方案1】:

您可以在(,+ 后面使用积极的看法

Regex101

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

【讨论】:

  • 可能只是(?&lt;=[(,+])\\w+[...]中的字符不需要转义。
  • @nicael 谢谢我不知道 :)
  • @YassinHajaj。这确实解决了问题,但 Sam 的解决方案更通用。例如"NNULL(EUR,VALUE)+NNULL(SOMESTR,1)";
  • @Puneet 没问题,希望它至少有一点帮助:)
【解决方案2】:

你觉得你想要的输出会是怎样产生的?

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

看来您要做的是根据您尚未明确定义的一组规则对字符串进行标记,然后替换某些标记。

首先,定义一个匹配单个“令牌”的简单正则表达式。根据您的问题,我猜您想考虑单词和符号,因此标记将是 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");
}

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

【讨论】:

  • ,感谢您的建议。我知道可以使用正则表达式以编程方式完成。我不确定是否有直接的方法可以通过一次常规的 exp 标记化来做到这一点。因此发布了这个问题。再次感谢。
【解决方案3】:

您建议的模式[^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)

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多