如何从流中删除转义序列

本文关键字:删除 转义序列 | 更新日期: 2023-09-27 18:08:03

是否有一种快速的方法可以从流/字符串中找到(并删除)所有转义序列?

如何从流中删除转义序列

希望下面的语法对您有所帮助

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

转义序列是一个字符串,通常以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()