有一种从Stream / String中查找(并删除)所有escape sequences的快捷方法吗?
答案 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()