我正在尝试编写一个以String
为输入的简单程序。如果String
与regex
表达式匹配,则返回该表达式。如果没有,我需要经历它,找到导致问题的每个字符并将其删除。
我遇到的问题是我使用基于for loop
长度的String
,但每次移除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循环之外,还有更好的方法吗?或者我只是遗漏了一些明显的东西?
感谢。
答案 0 :(得分:3)
这样的正则表达式会有所帮助:
public static void main(String[] args) {
String s = "09fdghdghh0";
System.out.println(s.replaceAll("\\D", "")); // \\D removes everything which is not a number
}
O / P
090
答案 1 :(得分:1)
我认为你最好的选择是使用模式和匹配类
//Regex goes here
Pattern p = Pattern.compile("[0-9]+");
//Your string goes here
Matcher m = p.matcher(id);
if (m.find()) {
System.out.println(m.group(1));
}
这应该提取你想要的任何文字。
答案 2 :(得分:0)
我会将replaceAll
与负正则表达式一起使用,然后与原始版本进行比较。
例如:
String text = "10";
System.out.println(text.replaceAll("[^0-9]", " ").equals(text));
答案 3 :(得分:0)
另一种方法是遍历整个字符串,然后将正确的值(而不是删除错误的值)添加到resultString