如何编写用于在 grepl 中检查字符串中是否存在非常规字符的函数?

How to write a function for checking a string for unconventional characters in grepl?

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

下面的函数 return 当字符串的长度不是至少 8 个字符并且包含任何空格时为 FALSE。

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

我不太了解 grepl 中的条件是如何工作的。我尝试将 grepl("[:punct:]", x)grepl("^[:punct:]+$", x) 置于 grepl 条件中以检查任何符号,并使用 [:alnum:] 代替 [:punct:] 以检查是否只有字母,但这些似乎总是 return 错误。

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

确保整个字符串为字母数字的正则表达式是 "^[[:alnum:]]+$"^ 表示“匹配字符串的开头”,然后 [[:alnum:]]+ 表示“匹配任意数量的字母数字字符”,然后 $ 表示“匹配字符串的结尾”。因此,如果字符串的开头和结尾之间有字母数字字符以外的任何字符,您将无法匹配。

您还可以稍微简化一下您的逻辑。写if(grepl("blah", x) == TRUE) FALSE else TRUE只是写!grepl("blah", x)的路漫漫其修远兮。此外,您可以使用 & 运算符来测试两个逻辑测试是否为 TRUE

,而不是分支 if 语句

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

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