R REGEX匹配-至少1个小写字母,1个数字,并且长度不超过8个特殊字符

时间:2018-08-14 04:46:20

标签: r regex grepl

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

  1. 包含1个或多个小写字母
  2. 包含1个或多个数字
  3. 仅允许使用小写字母(a-z)或数字,即不得使用空格,特殊字符 字符,没有其他标点符号
  4. 字符串必须正好是8个字符长

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

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

有什么想法我要去哪里吗?

包含案例的示例为:xxxxxxx8, 1234567x, ab12ef78

排除案例的示例为:x!3d5f78, x23456789, Ab123456

2 个答案:

答案 0 :(得分:4)

您非常接近,您掌握了正确的关键概念(主要是前瞻性)。您可以使用:

urlpatterns = [
                  path('users/<int:pk>/follow/<int:target_id>/', UserViewSet.as_view({"post": "follow"}))

              ]

就个人而言,我发现使用命名字符类的可读性更高,因此我将其编写为:

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

我还移除了外部括号(不必要),并固定了开头和结尾。

以下是您的示例输入的结果:

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

答案 1 :(得分:1)

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

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