0

我有一个 PCL 文件的存档。我想制作一个控制台应用程序,它可以读取文件,删除所有打印控制代码,并将代码写入单独的文件,让文档的其余部分保持一致。我想我可以用 regex() 来做到这一点,但我不确定如何处理这项任务。我选择的语言是 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。有任何想法吗?

4

2 回答 2

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

所以现在,在你的 main 或者你称之为 getPclCodes 的地方,你可以做这样的事情。

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

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

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

于 2012-12-12T09:43:50.400 回答
0

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

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

工作原理:在每一行中查找并删除任何以 ESC ( \x1B) 开头并一直持续到 64-94 位 ASCII 字符(即 AZ 或任何一个@[\]^)的字符序列。尾随g意味着重复,直到没有进一步的匹配。

于 2021-02-28T08:10:17.843 回答