Как удалить escape-последовательности из потока - PullRequest
3 голосов
/ 08 сентября 2011

существует ли быстрый способ найти (и удалить) все escape-последовательности из потока / строки ??

Ответы [ 5 ]

8 голосов
/ 08 сентября 2011

Надеюсь, что приведенный ниже синтаксис поможет вам полностью

string inputString = @"hello world]\ ";

StringBuilder sb = new StringBuilder();
string[] parts = inputString.Split(new char[] { ' ', '\n', '\t', '\r', '\f', '\v','\\' }, StringSplitOptions.RemoveEmptyEntries);
int size = parts.Length;
for (int i = 0; i < size; i++)
    sb.AppendFormat("{0} ", parts[i]);
3 голосов
/ 08 сентября 2011

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

Хотя при отладке вы можете увидеть эти символы, представленные в отладчике как экранированные символы, фактические символы в потоке не являются" экранированными ", они являются реальными символами (например, символом новой строки).

Если вы хотите удалить определенные символы (например, символы новой строки), удалите их так же, как и любой другой символ (например, букву «а»)

// Removes all newline characters in a string
myString.Replace("\n", "");

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

// Replaces the string "\n" with the newline character
myString.Replace("\\n", "\n");

В приведенном выше примере я использую escapeпоследовательность обратной косой черты, чтобы я соответствовал строке "\ n", а неf символ новой строки.

0 голосов
/ 08 февраля 2012

Вы можете использовать System.Char.IsControl () для обнаружения управляющих символов.

Для фильтрации управляющих символов из строки:

public string RemoveControlCharacters(string input)
{
    return
        input.Where(character => !char.IsControl(character))
        .Aggregate(new StringBuilder(), (builder, character) => builder.Append(character))
        .ToString();
}

Для фильтрации управлениясимволы из потока вы можете сделать что-то подобное, однако сначала вам понадобится способ преобразовать Stream в IEnumerable<char>.

public IEnumerable<char> _ReadCharacters(Stream input)
{
    using(var reader = new StreamReader(input))
    {
        while(!reader.EndOfStream)
        {
            foreach(var character in reader.ReadLine())
            {
                yield return character;
            }
        }
    }
}

Затем вы можете использовать этот метод для фильтрации управляющих символов:

public string RemoveControlCharacters(Stream input)
{
    return
        _ReadCharacters(input)
        .Where( character => !Char.IsControl(character))
        .Aggregate( new StringBuilder(), ( builder, character ) => builder.Append( character ) )
        .ToString();
}
0 голосов
/ 30 сентября 2011

Escape-последовательность - это строка символов, обычно начинающаяся с ESC-символа, но может содержать любой символ. Они используются на терминалах для управления графическим режимом положения курсора и т. Д. http://en.wikipedia.org/wiki/Escape_sequence Вот моя реализация с Python. Должно быть достаточно легко, чтобы перевести на C.

#!/usr/bin/python2.6/python
import sys

Estart="\033" #possible escape start keys
Estop="HfABCDsuJKmhlp" #possible esc end keys
replace="\015" # ^M character
replace_with="\n"
f_in = sys.stdin
parsed = sys.stdout
seqfile= open('sequences','w')#for debug


in_seq = 0

c = f_in.read(1)

while len(c) > 0 and not c=='\0':
    while len(c)>0 and c!='\0' and not c in Estart:
        if not c in replace : 
            parsed.write(c)
        else:
            parsed.write(replace_with[replace.find(c)])
        c = f_in.read(1)
    while len(c)>0 and c!='\0' and not c in Estop:
        seqfile.write(c)
        c = f_in.read(1)
    seqfile.write(c) #write final character
    c = f_in.read(1)

f_in.close()
parsed.close()
seqfile.close()
0 голосов
/ 08 сентября 2011

Если вы собираетесь использовать меньше строк кода:

string inputString = "\ncheese\a";
char[] escapeChars = new[]{ '\n', '\a', '\r' }; // etc

string cleanedString = new string(inputString.Where(c => !escapeChars.Contains(c)).ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...