代码之家  ›  专栏  ›  技术社区  ›  User987

regex不允许使用加号和下划线

  •  0
  • User987  · 技术社区  · 6 年前

    所以我现在有一个regex,看起来像这样:

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

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

    现在我想在这个regex中添加以下条件:

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

    有人能帮我吗?我从来没有完全理解regex表达式…

    如何添加?

    1 回复  |  直到 6 年前
        1
  •  1
  •   V0ldek    6 年前

    所以一步一步

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

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

    从字符串中的任何位置删除+符号

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

    删除连续下划线__

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

    删除下划线、连字符或句点。在用户名的开头

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

    您可以将加号删除与现有regexp组合为:

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

    您必须单独运行最后两个替换,因为删除其他字符可能会导致 _ - . 移动到名称的开头,或下划线“粘在一起”;例如 .#..usern_#_ame 会被转换成 ..usern__ame 如果你只是运行 ^(_|\.|-)+ (__+) 条款与其他所有内容。 另外,我建议您单独运行第一个regexp,因为您说过 .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
    

    和regexps一样,您需要广泛地测试这一点,如果我忽略了什么,请告诉我。

    编辑:

    如果你想要一个能在分期付款中工作的解决方案 O(n) 然后它也很简单,您需要编写自己的“替换为空”方法,在每次匹配之后,返回的字符数与删除的字符数完全相同。我不想证明它的复杂性或正确性,但它是非常简单和最佳的:)