【问题标题】:Regex Remove unnecessary symbols with certain rules c#正则表达式使用某些规则c#删除不必要的符号
【发布时间】:2019-03-19 16:11:53
【问题描述】:

我想删除所有不必要的字符,以便名称有效,这里是规则:

• 长度在 3 到 16 个字符之间
• 仅包含字母、数字、连字符和下划线
• 之前、之后或中间没有多余的符号

这是输入:

Jeff、john45、ab、cd、peter-ivanov、@smith、sh、too_long_username、!lleg@l ch@rs、jeffbutt

到目前为止,我的正则表达式是:https://regexr.com/4ahls,我想删除:
@史密斯
!lleg@l
ch@rs

【问题讨论】:

  • 你有什么问题?你有没有尝试过?
  • 试试这样:string.Join(", ", Regex.Matches(s, @"(?<!\S)[a-zA-Z0-9_-]{3,16}(?![^\s,])").Cast<Match>().Select(x => x.Value))

标签: c# .net regex expression


【解决方案1】:

您自己的正则表达式 \b([a-zA-Z0-9_-]){3,16}\b 足以提供预期的匹配,但 \b 无法完成他们的工作,并且将允许部分匹配像 @smith 这样的单词给您 smith 因为 @ 不是单词字符的一部分,因此smith 中的s 将匹配,因为@s 之间的点确实是单词边界。您将需要一个不同的正则表达式,确保单词前面/后面有一个空格,此外还有逗号,因为有些单词后面跟有逗号,您想将它们计算在内。尝试使用这个正则表达式,

(?<= |^)[a-zA-Z0-9_-]{3,16}(?=[ ,]|$)

Demo

这应该只匹配符合规则的单词。

注意:始终将- 放在字符集中的开头或结尾处,否则它有时会表现得很奇怪并产生意想不到的结果。

【讨论】:

    【解决方案2】:

    你可以试试这个模式:(?=^[a-zA-Z0-9-_]{3,16}$).+

    通常积极的前瞻(?=...) 用于断言某些规则是有效的,正如您想要做的那样。说明:

    ^ - 匹配字符串的开头

    [a-zA-Z0-9-_]{3,16} - 匹配字符类中的至少 3 和 16 个字符:a-zA-Z - 所有字母,0-9 - 数字,-_ - 连字符或下划线

    $ - 字符串结束

    如果此断言成功,则将所有内容与.*匹配

    Demo

    【讨论】:

      【解决方案3】:

      您实际上不需要正则表达式来解决这个问题。使用旧好的 string.Split() 和进程名称

      var input = "Jeff, john45, ab, cd, peter-ivanov, @smith, sh, too_long_username, !lleg@l ch@rs, jeffbutt";
      var listOfNames = input.Split(new[] {",", " "}, StringSplitOptions.RemoveEmptyEntries)
          .Where(l => l.Length >= 3 && l.Length <= 18) // filter by length
          .Where(l => l.All(c => char.IsDigit(c) || char.IsLetter(c) || c == '-')) // filter by spec chars
          .ToList();
      

      现在您有一个包含四个名称的列表。如果您想将其转回字符串,只需加入您的姓名:

      var singleLine = string.Join(", ", listOfNames);
      // singleLine is "Jeff, john45, peter-ivanov, jeffbutt"
      

      【讨论】:

      • 名称是动态的,可以是不同的名称,仅作为我发布的示例。这个问题应该用正则表达式解决。
      • @NikoKaradzhov 您可以在我的示例中修改input。我的解决方案可以很好地与其他名称一起使用,直到它用逗号分隔。 应该用正则表达式解决 为什么?这是作业还是面试任务?如果不是,我看不到将解决方案绑定到正则表达式的理由
      • 因为任务是用正则表达式解决它,我也应该为即将到来的考试训练正则表达式:D
      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多