如何从流中删除转义序列

时间:2011-09-08 12:59:35

标签: c# escaping

有一种从Stream / String中查找(并删除)所有escape sequences的快捷方法吗?

5 个答案:

答案 0 :(得分:8)

希望波纹管语法将为您提供全面的帮助

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]);

答案 1 :(得分:3)

您所指的转义序列只是基于文本的字符复制,通常是不可打印的(如新行或制表符)或与源代码文件中使用的其他字符冲突(例如反斜杠“{{1 }}“)。

虽然在调试时您可能会在调试器中看到这些字符表示为转义字符,但是流中的实际字符不会“转义”,它们是那些实际字符(例如换行符号)。

如果您想删除某些字符(例如换行符),请按照与其他任何字符相同的方式删除它们(例如字母“a”)

\

如果您实际上对包含转义字符的字符串(例如源代码文件)进行了一些处理,那么您只需将转义后的字符串替换为未转义的字符串:

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

在上面我使用反斜杠的转义序列,以便匹配字符串“\ n”,而不是换行符。

答案 2 :(得分:0)

如果您需要更少的代码行:

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

string cleanedString = new string(inputString.Where(c => !escapeChars.Contains(c)).ToArray());

答案 3 :(得分:0)

您可以使用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();
}

答案 4 :(得分:-2)

Escape sequense是一个 string 字符,通常以ESC-char开头,但可以包含任何字符。它们用在终端上以控制光标位置图形模式等。 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()