【发布时间】:2018-01-25 18:47:02
【问题描述】:
我有一组变量,我想根据字符串中的字母字符和数字字符来拆分它们。
String strPolNuber= AFR123456;
所以,我所有的字符串都会在开头有 3-4 个字母字符,在结尾有 6-7 个数字。
我想将字母和数字分开,并通过在它们之间添加 # 来连接它们。
String strUpdatedString=AFR#123456;
有人可以帮忙吗?
【问题讨论】:
我有一组变量,我想根据字符串中的字母字符和数字字符来拆分它们。
String strPolNuber= AFR123456;
所以,我所有的字符串都会在开头有 3-4 个字母字符,在结尾有 6-7 个数字。
我想将字母和数字分开,并通过在它们之间添加 # 来连接它们。
String strUpdatedString=AFR#123456;
有人可以帮忙吗?
【问题讨论】:
所以你想把# 放在前面有字母字符和后面有数字的地方。您可以在 regex look-around mechanisms 的帮助下做到这一点。
实现它的代码看起来像
str = str.replaceAll("(?<=[a-zA-Z])(?=\\d)","#");
(?<=[a-zA-Z]) 确保匹配位置之前有字母字符,但不会在匹配本身中包含该字符(?=\\d) 确保匹配位置后有数字,并且数字不会包含在匹配中,因此不会被任何删除。【讨论】:
正则表达式替换怎么样:
strPolNuber.replaceAll("([a-zA-Z]+)", "$1#")
如果字符串遵循如此严格的结构,这应该可以工作。它是如何工作的?您将每个字符序列替换为相同的序列,后跟“#”。
【讨论】:
算法解决方案是这样的,
private String seperateAlphaNum(String in, int n) {
StringBuffer sb = new StringBuffer();
boolean notfound = true;
for (int i=0; i<n; i++) {
if (notfound && (int)in.charAt(i) < 65) {
sb.append("#");
sb.append(in.charAt(i));
notfound = false;
} else {
sb.append(in.charAt(i));
}
}
if (sb.length() == n) sb.append("#");
return sb.toString();
}
【讨论】:
另一种算法,
static String split(String s) {
for (int i = 0; i < s.length() - 1; i++) {
if (!Character.isLetter(s.charAt(i)))
return s.substring(0, i) + "#" + s.substring(i, s.length());
}
// String doesn't contain numeric part
return s;
}
【讨论】: