首页 > 解决方案 > 如何编写一个函数来检查 grepl 中的非常规字符的字符串?

问题描述

我创建了一个简单的 grepl 函数来检查字符串是否长于或等于 8 个字符并且不包含空格。就我的目的而言,这似乎太自由了。如何让 grepl 函数检查字符串中是否只有字母和数字,而不包含任何其他符号?

当字符串长度不超过 8 个字符并且包含任何空格时,下面的函数将返回 FALSE。

check_the_string <- function(x){
  if(nchar(x) >= 8){
    
    if(grepl("(\\s+)", x) == TRUE) {
       FALSE
       } else {
       TRUE
       }
    
  } else {FALSE}
}

我很难理解 grepl 中的条件是如何工作的。我尝试进入 grepl 条件grepl("[:punct:]", x)grepl("^[:punct:]+$", x)检查任何符号并[:alnum:]代替[:punct:]检查是否只有字母,但这些似乎总是返回 FALSE。

我会对特定的解决方案感到满意,或者只是朝着正确的方向推动解决该问题。

标签: rgrepl

解决方案


确保整个字符串是字母数字的正则表达式是"^[[:alnum:]]+$". ^表示“匹配字符串的开头”,然后表示[[:alnum:]]+“匹配任意数量的字母数字字符”,然后$表示“匹配字符串的结尾”。因此,如果字符串的开头和结尾之间除了字母数字字符之外还有其他字符,您将不会得到匹配。

您还可以稍微简化您的逻辑。写作if(grepl("blah", x) == TRUE) FALSE else TRUE只是一种漫长的写作方式!grepl("blah", x)if此外,您可以使用&运算符来测试两个逻辑测试是否都适用,而不是分支语句TRUE

所以你的函数变成了一个单行:

check_the_string <- function(x)  nchar(x) >= 8 & grepl("^[[:alnum:]]+$", x) 

我们可以在几个字符串上对其进行测试:

# More than 8 characters but contains a space
check_the_string("hello world")
#> [1] FALSE

# More than 8 characters but contains punctuation
check_the_string("helloworld!")
#> [1] FALSE

# Less than 8 characters
check_the_string("hello")
#> [1] FALSE

# More than 8 characters - letters only
check_the_string("HelloWorld")
#> [1] TRUE

# More than 8 characters - letters and numbers
check_the_string("HelloWorld2020")
#> [1] TRUE

推荐阅读