正規表現の特殊文字 、\^$.?*|+()[{
に一致させたい。私は試した:
x <- "a[b"
grepl("[", x)
## Error: invalid regular expression '[', reason 'Missing ']''
(同等にstringr::str_detect(x, "[")
またはstringi::stri_detect_regex(x, "[")
。)
値を2倍にしてエスケープすることはできません。
grepl("[[", x)
## Error: invalid regular expression '[[', reason 'Missing ']''
バックスラッシュも使用しません:
grepl("\[", x)
## Error: '\[' is an unrecognized escape in character string starting ""\["
特殊文字を一致させるにはどうすればよいですか?
これのいくつかの特別なケースは、古くてよく書かれている質問で、これの複製として生意気に閉じるのに十分である:
R正規表現のエスケープされた期間
Rで疑問符をエスケープする方法
正規表現のパイプ( "|")のエスケープ
Rは、バックスラッシュを 文字定数 のエスケープ値として扱います。 ... cat
を使用して処理する方法。
y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
## [1] "double quote: \", tab: \t, newline: \n, unicode point: €"
cat(y)
## double quote: ", tab: , newline:
## , unicode point: €
さらに読む: Rのバックスラッシュでバックスラッシュをエスケープすると、1ではなく文字列に2つのバックスラッシュが生成されます
正規表現で特殊文字を使用するには、最も簡単な方法は通常、バックスラッシュでエスケープすることですが、上記のように、バックスラッシュ自体をエスケープする必要があります。
grepl("\\[", "a[b")
## [1] TRUE
バックスラッシュを一致させるには、エスケープを二重にする必要があり、その結果4つのバックスラッシュが発生します。
grepl("\\\\", c("a\\b", "a\nb"))
## [1] TRUE FALSE
rebus
パッケージには、スラッシュの入力ミスを防ぐために、各特殊文字の定数が含まれています。
library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"
その他の例を参照してください:
?SpecialCharacters
問題は次の方法で解決できます。
library(rebus)
grepl(OPEN_BRACKET, "a[b")
特殊文字を角括弧で囲んで文字クラスを形成することもできます 。
grepl("[?]", "a?b")
## [1] TRUE
2つの特殊文字は、文字クラス内で特別な意味を持っています:\
および^
。
バックスラッシュは、文字クラス内にある場合でもエスケープする必要があります。
grepl("[\\\\]", c("a\\b", "a\nb"))
## [1] TRUE FALSE
キャレットは、開き角括弧の直後にある場合にのみエスケープする必要があります。
grepl("[ ^]", "a^b") # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b")
## [1] TRUE
rebus
では、文字クラスを作成することもできます。
char_class("?")
## <regex> [?]
すべての句読点を一致させたい場合は、[:punct:]
文字クラスを使用できます。
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
stringi
は、これを句読点のUnicode General Categoryにマッピングするため、その動作はわずかに異なります。
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
UGCにアクセスするためにクロスプラットフォーム構文を使用することもできます。
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
\\Q
と\\E
の間に文字を配置すると、正規表現エンジンは文字を正規表現としてではなく文字通りに処理します。
grepl("\\Q.\\E", "a.b")
## [1] TRUE
rebus
を使用すると、正規表現のリテラルブロックを記述できます。
literal(".")
## <regex> \Q.\E
正規表現が常に答えとは限りません。固定文字列に一致させたい場合は、たとえば次のようにします。
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
のようなキャラクターを一致させる最も簡単な方法だと思います
\^$.?*|+()[
r内の文字クラスを使用しています。スペースや句読点を含む可能性のあるデータファイルから列ヘッダーを削除するには、次のことを考慮してください。
> library(stringr)
> colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","")
このアプローチにより、通常は検出するために\\
でエスケープしなければならない空白文字に加えて、文字クラスを文字列に合わせて句読点文字に一致させることができます。以下のチートシートで文字クラスの詳細を確認できます。また、?regexp
と入力して詳細を確認することもできます。
https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf