【发布时间】:2015-01-30 13:40:54
【问题描述】:
我正在尝试编写一个以String 作为输入的简单程序。如果String 匹配regex 表达式,则返回它。如果没有,我需要仔细检查,找到导致问题的每个字符并将其删除。
我遇到的问题是我使用基于String 的长度的for loop,但是每次删除char 时,长度都会改变,因此会缩短for 循环。当 for 循环完成一半时,最终导致索引超出范围错误。
输入 "09fdghdghh0" - (应该返回 '090')
public String cleanID(String id){
System.out.println("id = " + id);
//String strRegex = "[a-zA-Z]+";
String numRegex = "[0-9]+";
StringBuilder sb = new StringBuilder(id);
System.out.println(sb.toString());
if(id.matches(numRegex)){
return sb.toString();
}else{
for(int i = 0; i < id.length(); i++){
System.out.println("sb length = " + sb.length());
if(!Character.toString(sb.charAt(i)).matches(numRegex)){
System.out.println(sb.charAt(i));
sb.deleteCharAt(i);
}
}
}
return sb.toString();
输出
sb length = 11
sb length = 11
sb length = 11
f
sb length = 10
g
sb length = 9
d
sb length = 8
h
sb length = 7
sb length = 7
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7
如您所见,循环中途失败。除了 for 循环之外,还有更好的方法吗?还是我只是遗漏了一些明显的东西?
谢谢。
【问题讨论】:
-
是的。向我们展示您要替换的内容。也许
replace()或replaceAll()可能会对您有所帮助。 -
当您删除字符时,
sb会变短,但id.length()不会变小,因此最终您将访问超出索引。但是首先应该有更好的方法来做到这一点,所以我不想把这个作为答案。
标签: java regex string stringbuilder