有没有办法用正则表达式用数字字符串替换数字字符串中的所有字母?
e.g。
"12a345b6"
应该成为:
1297345986
修改: 感谢友好和乐于助人的反应讽刺。一个简单的“不可能以你想要的方式”对我来说已经足够了。而不是这样,我接受了灌输,让我后悔发布这个问题。而不是扩展我的知识,我最终感到困惑和沮丧。 再次感谢!
答案 0 :(得分:3)
在这个问题的任何部分都没有必要使用正则表达式。您只需要获取每个字符,并将其转换为ASCII代码(如果它是字母表),否则保持原样。
StringBuilder
在这里很有用。
以下是您需要做的事情:
String str = "12a345b6";
StringBuilder builder = new StringBuilder();
for (char ch: str.toCharArray()) {
builder.append(Character.isDigit(ch) ? ch : String.valueOf((int)ch));
}
System.out.println(builder.toString());
请注意,在String.valueOf
类型转换周围使用int
是必要的,以避免将字符ch
提升为int
。这与JLS - Section #15.25:
否则,如果第二个和第三个操作数具有类型 convertible(§5.1.8)到数字类型,然后有几种情况:
- 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型为 提升了第二和第三个操作数的类型。
因此,如果您未将int
转换为String
,那么根据上述声明,第二个参数 - ch
将被提升为int
,因此为1
附加 ASCII代码而不是字符'1'
本身。
答案 1 :(得分:2)
如果您真的在寻找基于正则表达式的解决方案,那么此代码应该适合您:
String str = "12a345b6";
Pattern p = Pattern.compile("(?i)([a-z])");
Matcher m = p.matcher(str);
StringBuffer buf = new StringBuffer();
while (m.find()) {
m.appendReplacement(buf, "" + (int) m.group(1).charAt(0));
}
m.appendTail(buf);
System.out.printf("After: %s%n", buf);
After: 1297345986