R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]

Posted

技术标签:

【中文标题】R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]【英文标题】:R REGEX Match - at least 1 lowercase letter, 1 number, and no special characters at 8 length [duplicate] 【发布时间】:2019-01-20 20:46:00 【问题描述】:

我正在尝试在 R 中创建一个 grepl 正则表达式来匹配以下字符串:

    包含 1 个或多个小写字母 包含 1 个或多个数字 只允许小写字母 (a-z) 或数字,即没有空格,没有特殊字符 字符,没有其他标点符号 字符串长度必须正好为 8 个字符

但是,到目前为止,我的尝试并没有带来任何运气:

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)

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

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

我还移除了外部括号(不是必需的)并锚定了开头和结尾。

以下是示例输入的结果:

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

【讨论】:

谢谢!我很高兴我离得太远了!感谢您抽出宝贵的时间!这是一个有用的脚手架! grepl("^[a-z\\d]8$", x, perl = T) 呢? @snoram 不能保证至少有一个字母和至少一个数字。【参考方案2】:

您还可以通过分解测试来使用非常简单的正则表达式进行管理:

grepl("[a-z]", x) & # Contain 1 or more lowercase letters
  grepl("\\d", x) & # Contain 1 or more numbers
  !grepl("[A-Z]|\\s|\\pP|\\pS", x, perl = TRUE) & # no upper, space, punctuation nor special char.
  nchar(x) == 8L # is 8 characters

[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE

【讨论】:

确实如此,它允许单独打开和关闭各个标准。不过,它会比一个大的正则表达式慢,因为正则表达式引擎可以使匹配非常有效。并且还可以从块中构建正则表达式并将它们粘贴在一起,因此这是单正则表达式和多正则表达式之间的另一种选择。

以上是关于R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

RegEx 仅匹配数字和最多 3 个字符

搜索 2 个特定字母后跟 4 个数字 Regex

至少一个大写字母、一个小写字母、一个数字或特殊字符的正则表达式

常用正则表达式

(转)求正则表达式,密码必须包含大写字母小写字母数字

密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等