如何以类似grep的方式检测向量f字符串中的非ascii字符.例如下面我想返回c(1, 3)
或c(TRUE, FALSE, TRUE, FALSE)
:
x <- c("façile test of showNonASCII(): details{", "This is a good line", "This has an ümlaut in it.", "OK again. }")
尝试:
y <- tools::showNonASCII(x) str(y) p <- capture.output(tools::showNonASCII(x))
David Arenbu.. 15
另一种可能的方法是尝试将您的字符串转换为ASCII并尝试检测所有生成的不可打印的控制字符,这些字符无法转换
grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x)) ## [1] TRUE FALSE TRUE FALSE
虽然它似乎stringi
也有这种类型的东西的内置功能
stringi::stri_enc_mark(x) # [1] "latin1" "ASCII" "latin1" "ASCII"
两种解决方案都非常棒.这个更紧凑,可能对其他编码更加健壮,但是,不可否认,我对编码知之甚少. (2认同)
Tyler Rinker.. 12
稍后使用纯基础正则表达式来实现这个简单:
grepl("[^ -~]", x) ## [1] TRUE FALSE TRUE FALSE
更多信息:http://www.catonmat.net/blog/my-favorite-regex/
另一种可能的方法是尝试将您的字符串转换为ASCII并尝试检测所有生成的不可打印的控制字符,这些字符无法转换
grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x)) ## [1] TRUE FALSE TRUE FALSE
虽然它似乎stringi
也有这种类型的东西的内置功能
stringi::stri_enc_mark(x) # [1] "latin1" "ASCII" "latin1" "ASCII"
稍后使用纯基础正则表达式来实现这个简单:
grepl("[^ -~]", x) ## [1] TRUE FALSE TRUE FALSE
更多信息:http://www.catonmat.net/blog/my-favorite-regex/
你为什么不从中提取相关代码showNonASCII
?
x <- c("façile test of showNonASCII(): details{", "This is a good line", "This has an ümlaut in it.", "OK again. }") grepNonASCII <- function(x) { asc <- iconv(x, "latin1", "ASCII") ind <- is.na(asc) | asc != x which(ind) } grepNonASCII(x) #[1] 1 3