检测alpha +数字+破折号:必须包含数字

时间:2015-09-16 17:30:20

标签: regex r

我想在逻辑上找到文件中的ID。这些只有数字,字母和短划线。它们必须包含数字才能被考虑。我可以用2 grepl个语句做一个布尔值但是想用一个正则表达式做这个。我认为(跳过)(失败)可以工作,但不知道如何。在下文中,我希望将元素1,2,5,6视为ID。

g <- c(
    "868776767-ddd-dFFF-999999",
    "8888888",
    "bbbbbbfdfdgtfref-dsfcsdbcgwecbgfecshdcs-cdhscgbfsd",
    "bigbird",
    "2",
    "3-4",
    "swe%h"
)

## This works (I want this result with one regex)
grepl("[A-Za-z0-9-]+", g) & grepl("[0-9]+", g)

## I suspect using this could work with a single regex call.
grepl("(*SKIP)(*FAIL)", g)

2 个答案:

答案 0 :(得分:2)

无需搜索复杂的东西:

grepl("^[a-fA-F-]*[0-9][[:xdigit:]-]*$", g)

grepl("^[a-fA-F-]*+[[:xdigit:]-]+$", g, perl=T)

其中[:xdigit:]是包含[a-fA-F0-9]的POSIX字符类。 第二个版本使用占有量词来确保下一个字符是数字。

如果您想确保没有前导,尾随或连续的连字符:

grepl("^(?:[a-fA-F]+(?:-[a-fA-F]+)*)?[0-9][[:xdigit:]]*(?:-[[:xdigit:]]+)*$", g)

答案 1 :(得分:0)

您可以使用以下内容:

^(?=.*\d)[a-zA-Z0-9-]*$

<强>解释

  • ^:字符串的开头
  • (?=.*\d):展望至少一位数
  • [a-zA-Z0-9-]+:匹配多个字母或数字或-
  • $:字符串
  • 的结尾

<强>输出:

grepl("^(?=.*\\d)[a-zA-Z0-9-]*$", g, perl=TRUE)
## [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE