使用正则表达式从字符串中删除垃圾字符

时间:2010-05-31 11:44:29

标签: regex

我想删除除a-z和A-Z之外的字符串中的字符。为此创建了以下功能,它工作正常。

public String stripGarbage(String s) {
 String good = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
 String result = "";
 for (int i = 0; i < s.length(); i++) {
     if (good.indexOf(s.charAt(i)) >= 0) {
             result += s.charAt(i);
      }
   }
 return result;
}

任何人都可以告诉我一个更好的方法来实现同样的目标。可能正则表达式可能是更好的选择。

此致

哈利

6 个答案:

答案 0 :(得分:4)

以下内容应该比使用正则表达式和初始尝试的任何内容都快。

public String stripGarbage(String s) {
    StringBuilder sb = new StringBuilder(s.length());
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if ((ch >= 'A' && ch <= 'Z') || 
            (ch >= 'a' && ch <= 'z') ||
            (ch >= '0' && ch <= '9')) {
            sb.append(ch);
        }
    }
    return sb.toString();
}

关键点:

  • 在循环中使用StringBuilder比使用字符串连接快得多。 (后者生成N - 1垃圾字符串并复制N * (N + 1) / 2个字符以构建包含N个字符的字符串。)

  • 如果您对结果String的长度有一个很好的估计,那么最好预先分配StringBuilder以保存该数量的字符。 (但是如果你没有一个好的估计,内部重新分配等的成本会摊销到O(N),其中N是最终的字符串长度......所以这通常不是主要问题。)

  • 针对(最多)3个字符范围搜索字符的搜索速度明显快于搜索62个字符字符串中的字符。

  • 如果字符范围更多,则switch语句可能更快。但是,在这种情况下,将需要更多行代码来列出所有字母和数字的大小写。

  • 如果非垃圾字符与Character类的现有谓词匹配(例如Character.isLetter(char)等),则可以使用这些字符。如果您想匹配任何字母或数字......而不仅仅是ASCII字母和数字,这将是一个不错的选择。

  • 要考虑的其他替代方法是使用预先填充了非垃圾字符的HashSet<Character>boolean[]字符索引。如果在编译时不知道非垃圾字符集,这些方法就可以正常工作。

答案 1 :(得分:4)

你走了:

result = result.replaceAll("[^a-zA-Z0-9]", "");

但是如果你理解你的代码并且它是可读的,那么也许你有最好的解决方案:

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有   两个问题。

答案 2 :(得分:1)

这个正则表达式有效:

result=s.replace(/[^A-Z0-9a-z]/ig,'');

是传递给你函数的字符串,结果是只包含字母数字和数字的字符串。

答案 3 :(得分:1)

我知道这篇文章很老,但你可以通过使用System.Char结构来缩短Stephen C的答案。

public String RemoveNonAlphaNumeric(String value)
{
    StringBuilder sb = new StringBuilder(value);
    for (int i = 0; i < value.Length; i++)
    {
        char ch = value[i];

        if (Char.IsLetterOrDigit(ch))
        {
            sb.Append(ch);
        }
    }
    return sb.ToString();
}

仍然以更紧凑的方式完成同样的事情。

Char有一些非常棒的功能来检查文本。以下是一些供您日后参考的内容。

Char.GetNumericValue()         
Char.IsControl()              
Char.IsDigit()             
Char.IsLetter()              
Char.IsLower()             
Char.IsNumber()         
Char.IsPunctuation()          
Char.IsSeparator()            
Char.IsSymbol()         
Char.IsWhiteSpace()

答案 4 :(得分:0)

这有效:

public static String removeGarbage(String s) {
        String r = "";
        for ( int i = 0; i < s.length(); i++ )
            if ( s.substring(i,i+1).matches("[A-Za-z]") ) // [A-Za-z0-9] if you want include numbers
                r = r.concat(s.substring(i, i+1));
        return r;
    }

(编辑:虽然效率不高)

答案 5 :(得分:0)

/**
 *   Remove characters from a string other than ASCII
 *   
 * */
 private static StringBuffer goodBuffer = new StringBuffer();
    // Static initializer for ACSII
static {
     for (int c=1; c<128; c++) {
         goodBuffer.append((char)c);
       }
}

public String stripGarbage(String s) {
     //String good = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";       
     String good = goodBuffer.toString();
     String result = "";
     for (int i = 0; i < s.length(); i++) {
         if (good.indexOf(s.charAt(i)) >= 0) {
                 result += s.charAt(i);
          }
         else
             result += " ";
       }
     return result;
    }