Java正则表达式:替换除某些字符之外的所有字符

4

我有一个字符串 "u2x4m5x7",我想要替换所有非数字后跟 "x" 的字符为 ""。 输出应该是: "2x5x" 只有数字后面跟着 "x"。 但我得到的结果是: "2x45x7"

我正在执行以下操作:

String string = "u2x4m5x7";

String s = string.replaceAll("[^0-9+x]","");

求助!!!

3个回答

3

这里是一个使用String#replaceAll进行两个替换的单行代码:

System.out.println(string.replaceAll("\\d+(?!x)", "").replaceAll("[^x\\d]", ""));

这里是另一种有效的解决方案。我们可以使用正式的模式匹配器并使用模式\d+x迭代输入字符串。这是白名单方法,尝试匹配我们想要保留的变量组合。

String input = "u2x4m5x7";
Pattern pattern = Pattern.compile("\\d+x");
Matcher m = pattern.matcher(input);
StringBuilder b = new StringBuilder();

while(m.find()) {
    b.append(m.group(0));
}

System.out.println(b)

这将打印:

2x5x

@HarshalParekh 是的,可以使用 String#replaceAll 来完成。但请记住,replaceAll 在底层使用模式匹配器,因此我的答案的第二部分并不像它看起来那么丑陋。 - Tim Biegeleisen
这个就是了 :D,非常感谢!!你们太棒了! - The Storyteller

2

看起来通过搜索匹配项而不是替换所有非匹配项会更简单,但这里有一个可能的解决方案,尽管它可能会漏掉一些情况:

\d(?!x)|[^0-9x]|(?<!\d)x

https://regex101.com/r/v6udph/1

简单来说,它会:

  • \d(?!x) -- 移除任何不跟在 x 后面的数字
  • [^0-9x] -- 移除所有非 x 或数字的字符
  • (?<!\d)x -- 移除所有前面没有数字的 x

但是,从 \dx 中获取信息会更简单。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接