【问题标题】:Exclude non printable characters except new line排除除换行之外的不可打印字符
【发布时间】:2023-04-09 18:34:02
【问题描述】:

我有这样的问题: string filter: detect non-ASCII signs in C# 但我应该排除字符串中所有不可打印的字符除了换行字符(\n)。

从正则表达式选项开始:

foo = System.Text.RegularExpressions.Regex.Replace(foo, @"[^\u0020-\u007E]+", string.Empty);

我是这样修改的:

foo = System.Text.RegularExpressions.Regex.Replace(foo, @"[\u0000-\u0009\u000B-\u000C\u000E-\u0019\u007F]+", string.Empty);

这似乎工作正常,但你能建议一个不那么冗长的解决方案吗? 提前致谢

【问题讨论】:

  • 如果你不擅长正则表达式,请尝试不使用它
  • 您的意思是“除了换行符 (\n) 和回车符 (\r) 之外”?
  • 正确。我应该保留回车和换行。
  • 你不是没有过滤掉一些不可打印的字符,即0x1a到0x1f包括在内吗?
  • 试试[\p{Cc}-[\r\n]]+

标签: c# regex ascii


【解决方案1】:
Regex regex = new Regex(@"\p{C}+");    
string strWithPrintableChars = string.Join('\n'.ToString(),
                    foo.Split('\n').Select(line => regex.Replace(line, "")));

解释:

【讨论】:

  • 请补充说明,方便后人理解
  • 在 .net 核心和多平台的上下文中,我建议将这部分更改为: foo.Split('\n') 到 foo.Split(new char[] { '\n', ' \r' }, StringSplitOptions.RemoveEmptyEntries) 和 string.Join('\n'.ToString() 到 string.Join(Environment.NewLine, foo......
  • 感谢塞巴斯蒂安,实际上这个问题被明确地询问了 '\n' 并且已在答案中用于解释。但是,请在您的观点上找到我的评论。 1. "foo.Split('\n') to foo.Split(new char[] { '\n', '\r' }" - 如果我们同时处理换行和回车,这会更好。 2. "string.Join(Environment.NewLine, foo......" -- 这不应该使用,因为它可能会在 windows 的结果中引入 '\r',这不是问题的目标。跨度>
猜你喜欢
  • 2021-08-04
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多