Чтобы удалить символы мусора из строки с помощью регулярных выражений - PullRequest
5 голосов
/ 31 мая 2010

Я хочу удалить символы из строки, отличной от 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;
}

Может кто-нибудь сказать мне лучший способ добиться того же. Возможно, регулярное выражение может быть лучшим вариантом.

Привет

Harry

Ответы [ 6 ]

4 голосов
/ 31 мая 2010

Вот, пожалуйста:

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

Но если вы понимаете свой код и он доступен для чтения, возможно, у вас есть лучшее решение:

Некоторые люди, когда сталкиваются с проблема, подумай "Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы.

4 голосов
/ 31 мая 2010

Следующее должно быть быстрее, чем что-либо, использующее регулярное выражение и вашу первоначальную попытку.

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 - это конечная длина строки ... так что обычно это не главная проблема.)

  • Поиск при тестировании символа с использованием (до) трехсимвольных диапазонов будет в среднем значительно быстрее, чем поиск символа в строке из 62 символов.

  • Оператор switch может быть быстрее, особенно если имеется больше диапазонов символов. Однако в этом случае потребуется гораздо больше строк кода, чтобы перечислить регистры для всех букв и цифр.

  • Если символы без мусора соответствуют существующим предикатам класса Character (например, Character.isLetter(char) и т. Д.), Вы можете использовать их. Это было бы хорошим вариантом, если вы хотите сопоставить любую букву или цифру ... а не только буквы и цифры ASCII.

  • Другие альтернативы, которые следует рассмотреть, - это использование HashSet<Character> или boolean[], проиндексированных символами, которые были предварительно заполнены не-мусорными символами. Эти подходы хорошо работают, если набор не-мусорных символов неизвестен во время компиляции.

1 голос
/ 14 ноября 2010

Я знаю, что этот пост старый, но вы можете немного сократить ответ Стивена С., используя структуру System.Char.

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()
1 голос
/ 31 мая 2010

Это регулярное выражение работает:

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

s - строка, переданная вам в функцию, а в результате - строка с буквенно-цифровыми и только цифрами.

0 голосов
/ 20 июня 2012
/**
 *   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;
    }
0 голосов
/ 31 мая 2010

это работает:

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

(редактировать: хотя это не так эффективно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...