POSIX 文字クラスは、文字クラス内にラップする必要があります。正しい形式は [[:punct:]]
. POSIX 用語の「文字クラス」を、正規表現文字クラスと通常呼ばれるものと混同しないでください。
この ASCII 範囲の POSIX 名前付きクラスは、すべての非制御文字、非英数字、非スペース文字に一致します。
ascii <- rawToChar(as.raw(0:127), multiple=T)
paste(ascii[grepl('[[:punct:]]', ascii)], collapse="")
# [1] "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
ただし、 a が有効な場合、 ...locale
の動作が変わる可能性があります。 [[:punct:]]
R ドキュメント?regex
には次のように記載されています。 特定の名前付きクラスの文字が事前定義されています。それらの解釈はロケールによって異なります ( localesを参照)。解釈は POSIX ロケールの解釈です。
punctの Open Group LC_TYPE 定義には、次のように記載されています。
句読点として分類する文字を定義します。
POSIX localeでは、<space>
クラス alpha、digit、または cntrl の文字も含まれません。
ロケール定義ファイルでは、キーワード upper、lower、alpha、digit、cntrl、xdigit、または as the に指定された文字は指定されません<space>
。
ただし、stringi パッケージはICUに依存しているようで、ロケールは ICU の基本的な概念です。
stringi パッケージを使用して、Unicode プロパティ\p{P}
と\p{S}
を使用することをお勧めします。
\p{P}
あらゆる種類の句読点に一致します。つまり、POSIX クラスpunctに含まれる 9 文字が欠落しています。これは、Unicode が、POSIX が句読点と見なすものを句読点と記号の 2 つのカテゴリに分割するためです。ここで\p{S}
出番です...
stri_replace_all_regex(string1, '[\\p{P}\\p{S}]', ' ')
# [1] "this is a test" "this is also a test"
# [3] "this is the final test" "this is the final test "
gsub
または、これを非常にうまく処理するベース R からフォールバックします。
gsub('[[:punct:]]', ' ', string1)
# [1] "this is a test" "this is also a test"
# [3] "this is the final test" "this is the final test "