有没有办法使用正则表达式将数字字符串中的所有字母替换为它们的 ASCII 数字?
例如
"12a345b6"
应该变成:
1297345986
编辑:感谢您的友好和有益的反应讽刺。一个简单的“不,不可能以你想要的方式”对我来说就足够了。相反,我收到的灌输让我后悔发布这个问题。而不是扩展我的知识,我最终感到困惑和沮丧。再次感谢!
在问题的任何部分都不需要使用正则表达式。您只需要获取每个字符,并将其转换为 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 - 第 #15.25 节中指定的:
否则,如果第二个和第三个操作数具有可转换(第 5.1.8 节)为数字类型的类型,则有以下几种情况:
- 否则,二进制数值提升(第 5.6.2 节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。
因此,如果您不将 转换int
为String
,那么根据上述语句,第二个参数 -ch
将被提升为int
,从而附加ASCII 代码而1
不是字符'1'
本身。
如果您真的在寻找基于正则表达式的解决方案,那么此代码应该适合您:
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