r - 如何编写一个函数来检查 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。
我会对特定的解决方案感到满意,或者只是朝着正确的方向推动解决该问题。
解决方案
确保整个字符串是字母数字的正则表达式是"^[[: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
推荐阅读
- php - Docker - Laravel - 无法设置它
- apache - Let's Encrypt 证书的问题:https://www.website.com 无法使用重定向到 https://website.com
- django - 如何在 django 中创建查询集?
- chart.js - Chart.js 标签和点在右侧截断
- ansible - 在 Ansible 循环中,从注册结果中测试文件是否存在
- ios - 如何在 iOS 13 中识别用户最后一次交互的 UIScene
- python-3.x - 带有 conda 集成的 pySpark 抛出错误 pyspark 无法识别
- node.js - NodeJS / Express:发生不一致的[ERR_HTTP_HEADERS_SENT]
- java - 多次重启后如何唯一标识一个java进程
- python - 如何从熊猫数据框中的一列列表中的列表中随机选择