2016-01-05 19 views
17

grepのような方法でベクトルf文字列の非ASCII文字を検出するにはどうすればよいですか?例えば、私はc(1, 3)またはc(TRUE, FALSE, TRUE, FALSE)を返したいのですが、以下の:文字列内の非ASCII文字を検出する

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)) 
+2

たぶん 'stringi :: stri_enc_mark(x)'は? –

+0

@ダビデ私はそうするだろうと思う...あなたは答えとして投げることができる。たぶん、他の人がそれに問題を見たり、さまざまな解決策を見たりします。 –

+0

Unicodeを適切に処理するようにコードを修正してみませんか? –

答えて

14

別の可能な方法は、それがstringiらしいけど

grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x)) 
## [1] TRUE FALSE TRUE FALSE 

を変換することができませんでしたすべての生成非印刷可能な制御文字を検出するために、ASCIIとしようとするあなたの文字列を変換しようとすることですあまりに

stringi::stri_enc_mark(x) 
# [1] "latin1" "ASCII" "latin1" "ASCII" 
+2

両方のソリューションは素晴らしいです。これはもう少しコンパクトで、他のエンコーディングよりも堅牢であるかもしれませんが、確かに、私はエンコーディングについてはほとんど知りません。 –

8

は、なぜあなたは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 
8

この後に使用して、純粋な基本正規表現ANに出くわした事のこのタイプのための機能が組み込まれていますDとても簡単:ここ

grepl("[^ -~]", x) 
## [1] TRUE FALSE TRUE FALSE 

より:http://www.catonmat.net/blog/my-favorite-regex/