web-dev-qa-db-ja.com

正規表現で\ ^ $。?* | +()[{などの特殊文字を処理するにはどうすればよいですか?

正規表現の特殊文字\^$.?*|+()[{に一致させたい。私は試した:

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で疑問符をエスケープする方法
正規表現のパイプ( "|")のエスケープ

60
Richie Cotton

二重バックスラッシュでエスケープする

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エスケープを使用する

\\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", "[")
86
Richie Cotton

のようなキャラクターを一致させる最も簡単な方法だと思います

\^$.?*|+()[

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

1
petergensler