正则表达式不允许加号和下划线

Regex to disallow plus sign and underscores

所以我目前有一个正则表达式,如下所示:

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

这样做是删除 @、&、'、(、)、< 或 > 并将它们替换为“”(空字符串)

现在我想在这个正则表达式中添加以下条件:

有人可以帮我解决这个问题吗?我一直不太了解正则表达式...

如何添加?

所以一步步来

remove any part of string that contains these: .com, .net, .org, .edu

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

remove + sign from string, wherever it may be found in string

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

remove consecutive underscores __

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

remove an underscore _, hyphen -, or period . at the beginning of a username

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

您可以将加号删除与现有的正则表达式组合成:

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

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

但是,这有一个问题。您可以提供如下所示的用户名: user.co.comm。然后,在 运行 宁一个 Regex.Replace 之后,你会得到 user.com。我不知道 .NET 中是否有标准方法可以帮助您解决这个问题,并且一次性完成这样的 "reactive" 替换需要更复杂的算法。 但是,对于一个简单的解决方案,只要有任何匹配项,您就可以 运行 第一个替换。这将花费 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) 那么它也很简单,你需要编写自己的 "replace with empty" 方法,在每次匹配后返回与它删除了。我不会证明复杂性或正确性,但它非常简单且最佳:)