【问题标题】:Why is this regex not allowing this text?为什么这个正则表达式不允许这个文本?
【发布时间】:2013-02-20 19:57:38
【问题描述】:

我有一个用户名验证器IsValidUsername,我正在测试“baconman”,但它失败了,有人可以帮我解决这个正则表达式吗?

if(!Regex.IsMatch(str, @"^[a-zA-Z]\\w+|[0-9][0-9_]*[a-zA-Z]+\\w*$")) {
    isValid = false;
}

我希望限制是:(非常接近)

  1. 长度介于 5 到 17 个字符之间
  2. 至少包含一个字母
  3. 没有空格
  4. 没有特殊字符

【问题讨论】:

  • “长度在 5 到 17 个字符之间”我在正则表达式中看不到任何内容。你试过了吗?这里不是做作业的地方……
  • 您没有按照 5-17 个字符的标准进行编码。在表达式中包含该点
  • 哎呀抱歉,5-17 在其他地方被照顾了。

标签: c# regex validation


【解决方案1】:

您不必要地转义:如果您将正则表达式编写为在字符串之外以 @ 开头,则不需要两个 \ - 一个就可以了。

要么:

@"\w"

"\\w"

编辑:我没有说清楚:现在由于双重转义,您正在寻找正则表达式中的 \ 和 w。所以你的匹配需要 [some character]\w 来匹配(例如: "a\w" 或 "a\wwwwww" 会匹配。

【讨论】:

    【解决方案2】:

    您的要求最好在普通 C# 中得到满足。它们不能很好地映射到正则表达式。只需使用 LINQ 对它们进行编码,它可以像在 IEnumerable<char> 上一样处理字符串。

    此外,理解字符串查询比理解符合您要求的正则表达式要容易得多。

    【讨论】:

      【解决方案3】:

      作为正则表达式的一部分可以做所有事情,但是它并不漂亮:-)

      ^(\w(?=\w*[a-zA-Z])|[a-zA-Z]|\w(?<=[a-zA-Z]\w*)){5,17}$
      

      它会进行 3 次检查,结果总是匹配 1 个字符(因此我们可以在最后执行长度检查)

      1. 该字符是 [a-zA-Z] 之前的任何单词字符 \w
      2. 或者是 [a-zA-Z]
      3. 或者是 [a-zA-Z] 之后的任何单词字符 \w

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        相关资源
        最近更新 更多