匹配字符范围内的元素n次

时间:2018-08-12 17:29:48

标签: r regex

假设我有一个像这样的字符串:

id = "ce91ffbe-8218-e211-86da-000c29e211a0"

我可以在R中编写什么正则表达式来验证此字符串长36个字符并且仅包含字母,数字和破折号?

文档中没有关于如何将字符范围(例如[0-9A-z-])与量词(例如{36})一起使用的信息。以下代码始终返回TRUE,而与量词无关。我确定我在这里遗漏了一些简单的东西...

id <- "ce91ffbe-8218-e211-86da-000c29e211a0"

grepl("[0-9A-z-]{36}", id)
#> [1] TRUE

grepl("[0-9A-z-]{34}", id)
#> [1] TRUE

仅当我在字符范围内添加对数字0-9的检查时,此行为才会开始。

3 个答案:

答案 0 :(得分:3)

可以请您尝试以下操作:

grepl("^[0-9a-zA-Z-]{36}$",id)

OR

grepl("^[[:alnum:]-]{36}$",id)

运行后,我们将得到以下输出。

grepl("^[0-9a-zA-Z-]{36}$",id)
[1] TRUE

说明: 此处添加以下内容仅出于解释目的。

grepl("        ##using grepl to check if regex mentioned in it gives TRUE or FALSE result.
^              ##^ means shows starting of the line.
[[:alnum:]-]   ##Mentioning character class [[:alnum:]] with a dash(-) in it means match alphabets with digits and dashes in regex.
{36}           ##Look for only 36 occurences of alphabets with dashes.
$",            ##$ means check from starting(^) to till end of the variable's value.
id)            ##Mentioning id value here.

答案 1 :(得分:2)

您要使用:

^[0-9a-z-]{36}$
  • ^声明行的起始位置。
  • [0-9a-z-]字符集,用于数字,字母a到z和破折号-
  • {36}匹配前面的模式36次。
  • $声明行尾位置。

here试试。

答案 2 :(得分:1)

如果字符串在目标字符之前或之后可以有其他字符,请尝试

id <- "ce91ffbe-8218-e211-86da-000c29e211a0"
grepl("^[^[:alnum:]-]*[[:alnum:]-]{36}[^[:alnum:]-]*$", id)
#[1] TRUE

grepl("^[^[:alnum:]-]*[[:alnum:]-]{34}[^[:alnum:]-]*$", id)
#[1] FALSE

这仍然有效。

id2 <- paste0(":+)!#", id)

grepl("^[^[:alnum:]-]*[[:alnum:]-]{36}[^[:alnum:]-]*$", id2)
#[1] TRUE

grepl("^[^[:alnum:]-]*[[:alnum:]-]{34}[^[:alnum:]-]*$", id2)
#[1] FALSE