如何从流中删除转义序列

是否有一种快速的方法来从Stream / String中查找(并删除)所有转义序列 ?

希望bellow语法将为您提供全面的帮助

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

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

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

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

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

如果您实际上对包含转义字符(例如源代码文件)的字符串进行了一些处理,那么您可以简单地将转义字符串替换为其未转义的等效字符串:

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

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

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

 string inputString = "\ncheese\a"; char[] escapeChars = new[]{ '\n', '\a', '\r' }; // etc string cleanedString = new string(inputString.Where(c => !escapeChars.Contains(c)).ToArray()); 

您可以使用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

 public IEnumerable _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(); } 

Escape sequense是一串字符,通常以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()