我有一个字符串 "u2x4m5x7",我想要替换所有非数字后跟 "x" 的字符为 ""。 输出应该是: "2x5x" 只有数字后面跟着 "x"。 但我得到的结果是: "2x45x7"
我正在执行以下操作:
String string = "u2x4m5x7";
String s = string.replaceAll("[^0-9+x]","");
求助!!!
这里是一个使用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
看起来通过搜索匹配项而不是替换所有非匹配项会更简单,但这里有一个可能的解决方案,尽管它可能会漏掉一些情况:
\d(?!x)|[^0-9x]|(?<!\d)x
https://regex101.com/r/v6udph/1
简单来说,它会:
\d(?!x)
-- 移除任何不跟在 x
后面的数字[^0-9x]
-- 移除所有非 x
或数字的字符(?<!\d)x
-- 移除所有前面没有数字的 x
但是,从 \dx
中获取信息会更简单。
String#replaceAll
来完成。但请记住,replaceAll
在底层使用模式匹配器,因此我的答案的第二部分并不像它看起来那么丑陋。 - Tim Biegeleisen