正则表达式禁止加号和下划线

时间:2018-08-08 09:06:49

标签: c# regex c#-4.0

所以我目前有一个正则表达式,看起来像这样:

TemplatedParent

这是删除@,&,',(,),<或>,然后将其替换为“”(空字符串)

现在,我还要在此正则表达式中添加以下条件:

  • 删除字符串中可以包含以下内容的任何部分:.com,.net,.org,.edu
  • 从字符串中删除+号,无论在字符串中何处找到
  • 删除连续的下划线__
  • 删除下划线_,连字符-或点号。用户名开头(例如-pezcollector

有人可以帮我这个忙吗?我从不完全了解正则表达式...

如何添加?

1 个答案:

答案 0 :(得分:1)

所以一步一步来

  

删除包含以下内容的字符串的任何部分:.com,.net,.org,.edu

Regex.Replace(competitor, @"(.com|.net|.org|.edu)", "");
  

从字符串中删除+号,无论在字符串中何处找到

Regex.Replace(competitor, @"\+", "");
  

删除连续的下划线__

Regex.Replace(comptetitor, @"(__+)", "")
  

删除下划线_,连字符-或点号。在用户名开头

Regex.Replace(competitor, @"^(_|\.|-)+", "");

您可以将加号删除与现有的正则表达式结合在一起:

Regex.Replace(competitor, @"(\s+|@|&|'|\(|\)|<|>|#|\+)", "");

您必须分别运行最后两个替换,因为删除其他字符可能会导致_ -.移到名称的开头,或在下划线“粘帖”在一起;例如,如果仅对其他所有内容运行.#..usern_#_ame..usern__ame子句,则^(_|\.|-)+将转换为(__+)。 另外,我建议您单独运行第一个正则表达式,因为您说.comuser会变成user,因此您需要在除去起始时间之前运行第一个正则表达式。

但是,这是一个问题。您可以提供一个如下所示的用户名: user.co.comm。然后,运行一个Regex.Replace后,您将得到user.com。我不知道.NET中是否有标准方法可以帮助您解决此问题,而一次扫描完成这种“反应性”替换将需要更复杂的算法。 但是,对于简单的解决方案,只要有任何匹配项,就可以运行第一个替换。这将花费O(n^2)的悲观时间,其中n是用户名的长度,如果整个用户名看起来像这样:.co.co.co.co.co.commmmmm,就会发生这种情况。

所以最后您想要的是这样的东西:

var username = Regex.Replace(competitor, @"(\s+|@|&|'|\(|\)|<|>|#|\+)", "");
username = Regex.Replace(username, @"(__+)", "");
username = Regex.Replace(username, @"^(_|\.|-)+", "");

// remove .com/.net etc. here, for example using while(Match) Replace

与正则表达式一样,您需要对此进行广泛的测试,请让我知道是否忽略了某些内容。

编辑:

如果您想要一个可以在摊销的O(n)中使用的解决方案,那么它也非常简单,您需要编写自己的“用空替换”方法,该方法在每次匹配后将返回与删除的字符一样多的字符。我不会证明其复杂性或正确性,但这很容易且很优化:)