Удалить все "невидимые" символы из строки?

Я пишу небольшой класс, чтобы прочитать список пар значений ключей из файла и записать в Dictionary<string, string>. Этот файл будет иметь следующий формат:

key1:value1
key2:value2
key3:value3
...

это должно быть довольно легко сделать, но так как пользователь собирается редактировать этот файл вручную, как я должен иметь дело с пробелами, вкладками, дополнительными скачками строк и тому подобное? Вероятно, я могу использовать Replace для удаления пробелов и вкладок, но есть ли другие "невидимые" символы, которые мне не хватает?

или, может быть, я могу удалить все символы, которые не являются буквенно-цифровыми,": "и прыжки строки (поскольку прыжки строки-это то, что отделяет одну пару от другой), а затем удалите все дополнительные прыжки строки. Если это так, я не знаю, как удалить символы" все, кроме некоторых".

конечно, я также могу проверить наличие ошибок, таких как"key1:value1:somethingelse". Но такие вещи не имеют большого значения, потому что это, очевидно, ошибка пользователя, и я бы просто показал сообщение "недопустимый формат". Я просто хочу разобраться с основными вещами и затем поместите все это в блок try/catch на случай, если что-то еще пойдет не так.

Примечание: мне вообще не нужны пробелы, даже внутри ключа или значения.

7 ответов


требования слишком размытые. Подумайте:

" когда пространство является значением? ключ?"
"Когда разделитель является значением? ключ?"
"Когда вкладка является значением? ключ?"
"Где заканчивается значение, когда разделитель используется в контексте значения? ключ"?

эти проблемы приведут к коду, заполненному одним выключением и плохим пользовательским опытом. Вот почему у нас есть языковые правила / грамматика.

определите простую грамматику и выньте большую часть догадки.

" {key}": "{value}",

здесь у вас есть пара ключ/значение, содержащаяся в кавычках и разделенная через разделитель (,). Все посторонние символы можно игнорировать. Вы можете использовать use XML, но это может отпугнуть менее техничных пользователей.

Примечание, кавычки произвольны. Не стесняйтесь заменять любой установленный контейнер, который не будет нуждаться в большом побеге (просто остерегайтесь сложности).

лично я бы завернул это в простой пользовательский интерфейс и сериализовать данные в формате XML. Бывают времена, когда этого не следует делать, но ты не дал мне повода не делать этого.


Я сделал это недавно, когда я, наконец, разозлился на слишком много недокументированного мусора, образующего плохой xml, проходило в ленте. Он эффективно стирает все, что не попадает между пробелом и ~ в таблице ASCII:

static public string StripControlChars(this string s)
{
    return Regex.Replace(s, @"[^\x20-\x7F]", "");
}

в сочетании с другими примерами регулярных выражений, уже опубликованными, это должно привести вас туда, куда вы хотите пойти.


Если вы используете регулярное выражение (регулярные выражения), вы можете отфильтровать все это с помощью одной функции.

строка newVariable регулярное выражение.Заменить(переменная, @"\ы", "");

это удалит пробелы, невидимые символы, \n и \r.


var split = textLine.Split(":").Select(s => s.Trim()).ToArray();

функция Trim () удалит все ненужные пробелы. Обратите внимание, что это сохраняет пробелы внутри ключа или значения, которые вы можете рассмотреть отдельно.


одно из" белых " пространств, которое регулярно кусает нас,-это неразрывное пространство. Также наша система должна быть совместима с MS-Dynamics, которая является гораздо более ограничительной. Сначала я создал функцию, которая сопоставляет 8-битные символы с их приблизительным 7-битным аналогом, затем я удалил все, что не было в диапазоне от x20 до x7f, далее ограниченном интерфейсом Dynamics.

Regex.Replace(s, @"[^\x20-\x7F]", "")

должен делать эту работу.


можно использовать string.Trim() для удаления пробелов:

var results = lines
        .Select(line => {
            var pair = line.Split(new[] {':'}, 2);
            return new {
                Key = pair[0].Trim(),
                Value = pair[1].Trim(),
            };
        }).ToList();
, Если вы хотите удалить все пробелы, вы можете использовать регулярные выражения:
var whiteSpaceRegex = new Regex(@"\s+", RegexOptions.Compiled);
var results = lines
        .Select(line => {
            var pair = line.Split(new[] {':'}, 2);
            return new {
                Key = whiteSpaceRegex.Replace(pair[0], string.Empty),
                Value = whiteSpaceRegex.Replace(pair[1], string.Empty),
            };
        }).ToList();

Если это не должно быть быстро, вы можете использовать LINQ:

string clean = new String(tainted.Where(c => 0 <= "ABCDabcd1234:\r\n".IndexOf(c)).ToArray());