Как удалить неизвестные отформатированные строки из массива строк?

Я пытаюсь удалить строки с нераспознанными символами из коллекции строк. Каков наилучший способ сделать это?

5 ответов

Решение

Чтобы удалить строки, содержащие любые символы, которые вы не можете распознать: (Например: если вы хотите принимать строчные буквы, то "foo@bar" будет отклонено ")

  1. Создайте регулярное выражение, которое определяет набор "распознанных" символов, начинается с ^ и заканчивается $. Например, если ваши "распознанные" символы имеют прописные буквы от A до Z, это будет ^[A-Z]$
  2. Отклонить строки, которые не совпадают

Примечание: это не будет работать для строк, которые содержат переводы строки, но вы можете настроить его, если вам нужно это поддерживать

Чтобы удалить строки, содержащие полностью символы, которые вы не можете распознать: (Например: если вы хотите принимать строчные буквы, то будет принята "foo@bar", поскольку она содержит хотя бы одну строчную букву)

  1. Создайте регулярное выражение, которое определяет набор "распознанных" символов, но с ^ символ в квадратных скобках, начинается с ^ и заканчивается $. Например, если ваши "распознанные" символы имеют прописные буквы от A до Z, это будет ^[^A-Z]$
  2. Отклонить строки, которые соответствуют

С Array (при условии string[]) не изменяет размер при удалении элементов, вам все равно нужно будет создать новый. Так что базовая фильтрация LINQ с ToArray() даст вам новый массив.

myArray = myArray.Where(s => !ContainsSpecialCharacters(s)).ToArray();

Это делает то, что вы, кажется, хотите.

List<string> strings = new List<string>()
{
    "one",
    "two`",
    "thr^ee",
    "four"
};

List<char> invalid_chars = new List<char>()
{
    '`', '-', '^'
};

strings.RemoveAll(s => s.Any(c => invalid_chars.Contains(c)));
strings.ForEach(s => Console.WriteLine(s));

генерирует вывод:

one
four

Я бы посмотрел на метод Linq where, а также на регулярное выражение, содержащее искомые символы. В псевдокоде:

return myStringCollection.Where(!s matches regex)

Этот вопрос имеет несколько похожих ответов на то, что я думаю, вы ищете. Тем не менее, я думаю, что вы хотите включить все буквы, цифры, пробелы и знаки препинания, но исключить все остальное. Это точно? Если это так, это должно сделать это для вас:

char[] arr = str.ToCharArray();

arr = Array.FindAll<char>(arr, (c => (char.IsLetterOrDigit(c) || 
                      char.IsWhiteSpace(c) || char.IsPunctuation(c))));
str = new string(arr);
Другие вопросы по тегам