如何使用正则表达式从文档中删除打印控制代码(PCL类型)

时间:2012-09-13 16:52:26

标签: c# .net regex printer-control-language

我有一个PCL文件存档。我想创建一个控制台应用程序,它将读取文件,删除所有打印控制代码,并将代码写入单独的文件,留下文档的其余部分。我想我可以使用正则表达式()进行此操作,但我不确定如何处理任务。我选择的语言是C#。您将提供的任何建议将不胜感激。

我已经取得了进展

    public static string RemoveBetween(string s, char begin, char end)
    {
        Regex regex = new Regex(string.Format("\\{0}.*?{1}", begin, end));
        return regex.Replace(s, string.Empty);
    }

    public static string[] getPclCodes(string line)
    {
        string pattern = "\\x1B.*?H";
        string[] pclCodes = Regex.Split(line, pattern);

        return pclCodes;
    }

但代码返回为空字符串。我可以将它们从PCL中删除并写入一个txt文件,但我也需要代码。我在RemoveBetween之前调用getPclCodes。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果我理解正确的话。这应该可以解决问题。我修改了您的方法以接受您希望由模式扫描的行和对MatchCollection的引用。这样,您可以在分割行之前简单地为匹配分配引用。

    public static string[] getPclCodes(string line, out MatchCollection codes)
    {
        string pattern = "\\x1B.*?H";

        Regex regex = new Regex(pattern);
        codes = regex.Matches(line);

        string[] pclCodes = Regex.Split(line, pattern);

        return pclCodes;
    }

所以,现在,在你的主要或任何你称之为getPclCodes的地方,你可以做这样的事情。

        MatchCollection matches;
        string[] codes = getPclCodes(codeString, out matches);

        foreach (Match match in matches)
            Console.WriteLine(match.Value);

我确信有更好的方法,但这又有效......如果我们在同一页面上。

答案 1 :(得分:0)

OP 大概想要 C#,但如果其他人只是想要它使用 GNU sed,这行得通:

sed 's/\x1B[^][@A-Z^\\]*[][@A-Z^\\]//g'

它是如何工作的:在每一行中查找并删除以 ESC (\x1B) 开头并一直持续到任何 ASCII 字符 64-94(即 A-Z 或 @[\]^ 中的任何一个)的任何字符序列。尾随的 g 表示重复直到不再匹配为止。