【问题标题】:alphanumeric with at least 1 character至少包含 1 个字符的字母数字
【发布时间】:2010-12-28 18:48:46
【问题描述】:

好的,所以我终于发现我需要以下内容:

所以正则表达式必须执行:

  1. 字母数字
  2. 至少 1 个字母
  3. 必须包含 4 到 8 个字符(字母/数字)。

即一个字母数字字符串,必须至少有 1 个字母,长度在 4-8 之间。 (所以不能全是数字或全是字母)。

所有这些都可以在一个正则表达式中完成吗?

【问题讨论】:

  • 字符是指字母,而 4-8 是指任何字母。

标签: c# regex


【解决方案1】:

我假设您的意思是字母数字,至少一个字母,长度为 4 到 8 个字符。

试试这个:

(?=.*[a-zA-Z])[a-zA-Z0-9]{4,8}
  • (?= - 我们使用的是lookahead,因此我们可以在不影响其余比赛的情况下检查某些内容

  • .*[a-zA-Z] - 匹配后跟字母的任何内容,即检查我们至少有一个字母

  • [a-zA-Z0-9]{4,8} - 这将匹配一个字母或数字 4 到 8 次。

但是,您说的意图是“不能全是数字或全是字母”,但要求 1、2 和 3 并不能做到这一点,因为它可以全是字母并满足所有三个要求。您可能想要这个,并通过额外的前瞻来确认至少有一个数字:

(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{4,8}

a-zA-Z 的使用在国际上不是很友好,因此如果在您的正则表达式中可用,您最好使用“字母”的转义码。

另外,我希望这与可接受的密码不匹配,因为 4 个字符可能不够长。

【讨论】:

  • 它不应该是 .+ 因为那样它就不会匹配 1aaa 例如。
  • @Dave:你错了。 .+ 表示至少 one 但 .* 与例如匹配。 “1111”。 ?Regex.IsMatch("1aaa", "(?=.+[a-zA-Z])[a-zA-Z0-9]{4,8}") true; ?Regex.IsMatch("1111", "(?=.*[a-zA-Z])[a-zA-Z0-9]{4,8}") false
  • 先行是为了检查一个字母是否在模式中,仅此而已,这就是它使用 * 的原因,因为字母可以出现在模式中的任何位置,甚至是第一个。我应该说的是,如果我使用 .+ 它将与 a111 不匹配(不是 1aaa)。
【解决方案2】:

数字 2 和 3 似乎矛盾。以下将匹配 4 到 8 之间的字母数字:

/[0-9a-zA-Z]{4,8}/

【讨论】:

  • 2 与 3 不矛盾,但是是多余的。
  • @Nick Dixon- 取决于您将它们解释为什么意思!
【解决方案3】:
?Regex.IsMatch("sdf", "(?=.+[a-zA-Z])[a-zA-Z0-9]{4,8}")
false
?Regex.IsMatch("sdfd", "(?=.+[a-zA-Z])[a-zA-Z0-9]{4,8}")
true
?Regex.IsMatch("1234", "(?=.+[a-zA-Z])[a-zA-Z0-9]{4,8}")
false

关于 **.*.+ 的警告:

// At least one letter does not match with .*
?Regex.IsMatch("1111", "(?=.*[a-zA-Z])[a-zA-Z0-9]{4,8}")
false

?Regex.IsMatch("1aaa", "(?=.+[a-zA-Z])[a-zA-Z0-9]{4,8}")
true

【讨论】:

    【解决方案4】:
    [a-zA-Z0-9]{4,8}
    

    第一部分指定字母数字,第二部分指定 4 到 8 个字符。

    【讨论】:

      【解决方案5】:

      试试:[a-zA-Z0-9]{4,8}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-30
        • 2011-12-12
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        相关资源
        最近更新 更多