正则表达式不允许加号和下划线
Regex to disallow plus sign and underscores
所以我目前有一个正则表达式,如下所示:
string username = Regex.Replace(competitor, @"(\s+|@|&|'|\(|\)|<|>|#)", "");
这样做是删除 @、&、'、(、)、< 或 > 并将它们替换为“”(空字符串)
现在我想在这个正则表达式中添加以下条件:
- 删除字符串中可能包含以下内容的任何部分:.com、.net、.org、.edu
- 从字符串中删除 + 符号,无论它在字符串中的什么位置
- 去掉连续的下划线__
- 删除下划线 _、连字符 - 或句点。在用户名的开头(例如,-pezcollector
有人可以帮我解决这个问题吗?我一直不太了解正则表达式...
如何添加?
所以一步步来
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" 方法,在每次匹配后返回与它删除了。我不会证明复杂性或正确性,但它非常简单且最佳:)
所以我目前有一个正则表达式,如下所示:
string username = Regex.Replace(competitor, @"(\s+|@|&|'|\(|\)|<|>|#)", "");
这样做是删除 @、&、'、(、)、< 或 > 并将它们替换为“”(空字符串)
现在我想在这个正则表达式中添加以下条件:
- 删除字符串中可能包含以下内容的任何部分:.com、.net、.org、.edu
- 从字符串中删除 + 符号,无论它在字符串中的什么位置
- 去掉连续的下划线__
- 删除下划线 _、连字符 - 或句点。在用户名的开头(例如,-pezcollector
有人可以帮我解决这个问题吗?我一直不太了解正则表达式...
如何添加?
所以一步步来
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" 方法,在每次匹配后返回与它删除了。我不会证明复杂性或正确性,但它非常简单且最佳:)