所以我目前有一个正则表达式,看起来像这样:
TemplatedParent
这是删除@,&,',(,),<或>,然后将其替换为“”(空字符串)
现在,我还要在此正则表达式中添加以下条件:
有人可以帮我这个忙吗?我从不完全了解正则表达式...
如何添加?
答案 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)
中使用的解决方案,那么它也非常简单,您需要编写自己的“用空替换”方法,该方法在每次匹配后将返回与删除的字符一样多的字符。我不会证明其复杂性或正确性,但这很容易且很优化:)