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个长度的特殊字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章