【问题标题】:Delete unwanted chars in a String Java删除 String Java 中不需要的字符
【发布时间】: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


【解决方案1】:

这样的正则表达式会有所帮助:

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

【讨论】:

    【解决方案2】:

    我认为你最好的选择是使用 Pattern 和 Matcher 类

    //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));
    
    }
    

    这应该提取您想要的任何文本。

    【讨论】:

      【解决方案3】:

      我会将replaceAll 与负正则表达式一起使用,然后与原始表达式进行比较。

      例如:

      String text = "10";
      System.out.println(text.replaceAll("[^0-9]", " ").equals(text));
      

      【讨论】:

      • 可能不想用空白代替,也许用“”代替。
      • @ErstwhileIII 我的回答中的替换是相当随意的。整个想法是测试验证,即原始的String 是否等于替换的String。如果没有发生替换(即没有不需要的字符),则它们相等并返回 true
      【解决方案4】:

      另一种方法是遍历整个字符串,然后将正确的值(而不是删除错误的值)添加到 resultString

      【讨论】:

        猜你喜欢
        • 2016-10-27
        • 1970-01-01
        • 2016-06-29
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        相关资源
        最近更新 更多