【问题标题】:Regex to replace invalid characters正则表达式替换无效字符
【发布时间】:2010-10-07 21:20:19
【问题描述】:

我对 RegEx 没有太多经验,因此我使用了许多链接的 String.Replace() 调用来删除不需要的字符——有没有我可以编写的 RegEx 来简化这一点?

string messyText = GetText();
string cleanText = messyText.Trim()
         .ToUpper()
         .Replace(",", "")
         .Replace(":", "")
         .Replace(".", "")
         .Replace(";", "")
         .Replace("/", "")
         .Replace("\\", "")
         .Replace("\n", "")
         .Replace("\t", "")
         .Replace("\r", "")
         .Replace(Environment.NewLine, "")
         .Replace(" ", "");

谢谢

【问题讨论】:

  • 即使这不是您首选的编码约定,如果您将每个 .Replace() 放在一个新行上,这将有助于该网站的可读性,因此不会出现大的水平滚动。跨度>

标签: c# regex


【解决方案1】:

试试这个正则表达式:

Regex regex = new Regex(@"[\s,:.;/\\]+");
string cleanText = regex.Replace(messyText, "").ToUpper();

\s 是等价于[ \t\r\n] 的字符类。


如果您只想保留字母数字字符,而不是将现有的每个非字母数字字符添加到字符类中,您可以这样做:

Regex regex = new Regex(@"[\W_]+");
string cleanText = regex.Replace(messyText, "").ToUpper();

其中\W 是任何非单词字符(不是[^a-zA-Z0-9_])。

【讨论】:

  • \s 也包含\v\f,但是这些不是很常用,所以应该没问题。
  • 您需要 RegexOptions.Multiline 还是您的正则表达式会处理它?
  • @Preet 我相信RegexOptions.Multiline 只会影响字符串锚点^$ 的开始和结束的行为,但我可能是错的。
  • 原来第二个选项是我真正在寻找的
【解决方案2】:

Character classes 来救援!

string messyText = GetText();
string cleanText = Regex.Replace(messyText.Trim().ToUpper(), @"[,:.;/\\\n\t\r ]+", "")

【讨论】:

  • @kevingessner: 使用 @"..." 否则你的 \t \r \n 将被 .NET 转化为他们的空白等价物。或者转义它们,但我认为 @ 更具可读性。
  • @quantumSoup, @Dinah:您不需要转义它们或使用@ - 空白等价物会匹配得很好。虽然通常使用带有正则表达式的逐字字符串是一个好主意。但这里没有必要。当然,他的代码确实替换了反斜杠(他(正确)确实转义的唯一字符)。
  • @Tim 现在可以了,但不是没有逐字字符串。
  • @Tim Pietzcker:好点;我的错。 @kevingessner:由于您要替换所有空格,因此不需要Trim()。此外,空格、\n、\t 和 \r 可以像 Rogue 一样用 \s 共同替换。
  • @quantumSoup:你说得对,`\` 在非逐字字符串中是行不通的。时间不早了,我该睡觉了……
【解决方案3】:

您可能想要使用白名单方法,有一大堆有趣的角色,其效果取决于组合可能不容易计算。

一个简单的正则表达式可以删除除允许的字符之外的所有内容,如下所示:

messyText = Regex.Replace(messyText, @"[^a-zA-Z0-9\x7C\x2C\x2E_]", "");

除了此正则表达式允许的字母数字字符外,^ 用于反转选择| , .和_您可以根据需要添加和删除字符和字符集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2015-11-30
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多