关于R REGEX匹配:R REGEX匹配 – 至少1个小写字母,1个数字,8个长度没有特殊字符

R REGEX Match - at least 1 lowercase letter, 1 number, and no special characters at 8 length

本问题已经有最佳答案,请猛点这里访问。

我试图在r中创建一个grepl regex来匹配以下字符串:

  • 包含1个或多个小写字母
  • 包含一个或多个数字
  • 只允许小写字母(a-z)或数字,即没有空格,没有特殊字符字符,没有其他标点符号
  • 字符串长度必须正好为8个字符
  • 然而,到目前为止,我的尝试并没有带来任何运气:

    1
    grepl("((?=.*[[:lower:]])(?=.*[[:digit:]])[[:alpha:]]{8})", x, perl=TRUE)

    知道我哪里出错了吗?

    纳入病例的例子有:xxxxxxx8, 1234567x, ab12ef78

    排除案例的例子有:x!3d5f78, x23456789, Ab123456


    你非常接近,你有正确的关键概念(主要是向前看)。你可以用这个:

    1
    grepl("((?=.*[[:lower:]])(?=.*[[:digit:]])[[:lower:][:digit:]]{8})", x, perl=TRUE)

    就个人而言,我觉得使用命名字符类的可读性不强,所以我会这样写:

    1
    grepl("^(?=.*[a-z])(?=.*\\d)[a-z\\d]{8}$", x, perl=TRUE)

    我还移除了外部的部分(不需要),并锚定了开始和结束部分。

    以下是示例输入的结果:

    1
    2
    3
    4
    x <- c("xxxxxxx8","1234567x","ab12ef78","x!3d5f78","x23456789","Ab123456")

    grepl("^(?=.*[a-z])(?=.*\\d)[a-z\\d]{8}$", x, perl=TRUE)
    # [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE


    您还可以通过分解测试来管理非常简单的regex:

    1
    2
    3
    4
    5
    6
    grepl("[a-z]", x) & # Contain 1 or more lowercase letters
      grepl("\\d", x) & # Contain 1 or more numbers
      !grepl("[A-Z]|\\s|\\p{P}|\\p{S}", x, perl = TRUE) & # no upper, space, punctuation nor special char.
      nchar(x) == 8L # is 8 characters

    [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE