我想删除除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;
}
任何人都可以告诉我一个更好的方法来实现同样的目标。可能正则表达式可能是更好的选择。
此致
哈利
答案 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;
}