假设我有一个像这样的字符串:
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的检查时,此行为才会开始。
答案 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)
答案 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