我有一个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。有什么想法吗?
答案 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
表示重复直到不再匹配为止。