R logo

特定の条件にマッチするかどうかを判定する関数には、str_detect()grepl()を使うことができる。

str_detect()stringr パッケージの関数で、grepl() はRの標準パッケージ(base)。

どちらとも正規表現が使える。

シンプルな検出なら grepl() でもよいけれど、str_detect()の方が汎用性が広いので、こちらをよく使っている。

また、str_detectには、始まりと終わりだけ手軽にマッチできる str_starts(), str_ends()等もあるけど、個人的には、正規表現を覚えてすべて正規表現でコードした方が良いと思う。

str_detect()

str_detect()は、stringerパッケージに含まれている関数なので、まずはパッケージを読み込む。

install.packages("stringr")
library(stringr)
str_detect()の基本構文
str_detect(string, pattern, negate = FALSE)
  • 引数
    • string: 文字列または文字ベクトル(チェックしたい文字列)
    • pattern: 正規表現または単純な文字列(検索する文字またはパターン)
    • negate: TRUE にすると、パターンが見つからない要素が TRUE になる(デフォルトは FALSE)。
  • 戻り値
    • string が単一の文字列の場合は、TRUE または FALSE が返される(パターンが見つかれば TRUE)。
    • string がベクトルの場合は、各要素ごとに**TRUE または FALSE のベクトル**が返される。

str_detect()の使用例

単純な文字の検出

str_detect("banana", "a")
output
[1] TRUE
  • "banana" に "a" が含まれているので、TRUE が返される。

ベクトルに対する検出

str_detect(c("apple", "banana", "cherry"), "a")
output
[1] TRUE TRUE FALSE
  • "apple" に "a" がある → TRUE
  • "banana" に "a" がある → TRUE
  • "cherry" に "a" はない → FALSE

正規表現の利用

str_detect("banana123", "\\d")
output
[1] TRUE
  • \\d は正規表現で数字 (0-9) を表すため、"banana123" に数字が含まれているため TRUE が返される。

negate = TRUE の使用

str_detect(c("apple", "banana", "cherry"), "a", negate = TRUE)
output
[1] FALSE FALSE TRUE
  • "apple" に "a" がある → FALSE(含まれているので FALSE
  • "banana" に "a" がある → FALSE(含まれているので FALSE
  • "cherry" に "a" がない → TRUE(含まれていないので TRUE

grepl()

grepl() は、Rの標準パッケージ(base)に含まれている関数なので、追加のパッケージを読み込む必要はない。

grepl() の基本構文
grepl(pattern, x)
  • 引数
    • pattern: 正規表現または単純な文字列(検索する文字またはパターン)
    • x: 文字列または文字ベクトル(チェックしたい文字列)
  • 戻り値
    • x が単一の文字列の場合は、TRUE または FALSE が返される(パターンが見つかれば TRUE)。
    • x がベクトルの場合は、各要素ごとに**TRUE または FALSE のベクトル**が返される。

grepl() の使用例

単純な文字の検出

grepl("a", "banana")
output
[1] TRUE
  • "banana" に "a" が含まれているので、TRUE が返される。

ベクトルに対する検出

grepl("a", c("apple", "banana", "cherry"))
output
[1] TRUE TRUE FALSE
  • "apple" に "a" がある → TRUE
  • "banana" に "a" がある → TRUE
  • "cherry" に "a" はない → FALSE

正規表現の利用

grepl("\\d", "banana123")
output
[1] TRUE
  • \\d は正規表現で数字 (0-9) を表すため、"banana123" に数字が含まれているため TRUE が返される。

str_detect() と grepl() の違い

以下に、str_detect()grepl() の違いをまとめた表を示す。

機能 str_detect() grepl()
所属パッケージ stringr パッケージ ベースR関数
引数の順番 string, pattern pattern, x(逆順)
ベクトル処理 ベクトルに自動対応 ベクトルに自動対応
ネゲート機能 negate = TRUE でネゲートが可能 直接のネゲート機能はないが、 !grepl()で代用可能
機能の範囲 正規表現に対応、stringrの便利機能を活用 正規表現に対応
返り値 TRUE/FALSE のベクトル TRUE/FALSE のベクトル

どちらを使うべきか?

基本は str_detect() を使うと考えておけばよい……が、シンプルなコードのときには grepl() でも良い……といったイメージ。

状況 推奨する関数 理由
1つの文字列を確認する grepl() stringr を読み込む必要がないから
ベクトルを処理する str_detect() ベクトル化されているので便利
正規表現を使う どちらでもOK どちらも正規表現に対応している
ベクトルの中でパターンが存在しない要素を確認したい str_detect(strings, "a", negate = TRUE) negate = TRUE を使えるため

正規表現を使った検出

正規表現を使った検出の例をいくつかまとめておく。

正規表現の種類etc.については、下記参照。

str_detect()grepl() のどちらも使えるけど、ここでは str_detect() を使ってまとめる。

正規表現を使った例(基本)

特定の文字を含むかどうかの判定

str_detect("banana", "a")
output
[1] TRUE
  • "banana" に "a" が含まれているため、TRUE が返される。

特定の文字が1回以上連続して出現するかどうか

str_detect("banana", "a+")
output
[1] TRUE
  • "banana" に "a" が複数回出現しているため、TRUE が返される。

特定の文字が0回以上連続して出現するかどうか

str_detect("banana", "a*")
output
[1] TRUE
  • "banana" には "a" が0回以上連続している部分があるため、TRUE が返される。

複数の文字のどれか1つにマッチ

str_detect("banana", "[aeiou]")
output
[1] TRUE
  • "banana" には "a" が含まれているため、TRUE が返される。

特定の文字列が先頭にあるかどうか

str_detect("banana", "^b")
output
[1] TRUE
  • "banana" は "b" で始まるので、TRUE が返される。

特定の文字列が末尾にあるかどうか

str_detect("banana", "a$")
output
[1] TRUE
  • "banana" は "a" で終わるので、TRUE が返される。

特定の文字列が含まれていないかどうか

str_detect("banana", "[0-9]")
output
[1] FALSE
  • "banana" には数字が含まれていないため、FALSE が返される。

ちょっと高度な使用例

複数の候補に一致するかどうか

str_detect("apple", "apple|banana|cherry")
output
[1] TRUE
  • "apple" に "apple" が含まれているため、TRUE が返される。

大文字小文字の区別をしない判定

str_detect("Apple", "(?i)apple")
output
[1] TRUE
  • "Apple" に "apple" が含まれているため、TRUE が返される。

数字が含まれているかどうか

str_detect("order123", "\\d")
output
[1] TRUE
  • "order123" に "123" が含まれているため、TRUE が返される。

連続する数字が含まれているかどうか

str_detect("order123", "\\d+")
output
[1] TRUE
  • "order123" に "123" という連続した数字が含まれているため、TRUE が返される。

特定の文字が繰り返し出現するかどうか

str_detect("banana", "(na){2}")
output
[1] TRUE
  • "banana" に "na" が2回連続している部分があるため、TRUE が返される。

複数の空白文字を検出

str_detect("Hello World", "\\s+")
output
[1] TRUE
  • "Hello World" には2つのスペースが含まれているため、TRUE が返される。

文字列の否定判定

含まれていないパターンを検出

str_detect("banana", "a", negate = TRUE)
output
[1] FALSE
  • "banana" には "a" が含まれているため、FALSE が返される。

含まれていないパターンを検出(正規表現)

str_detect("banana", "[0-9]", negate = TRUE)
output
[1] TRUE
  • "banana" には数字が含まれていないため、TRUE が返される。

ちょっと便利な実践例

便利な使い方色々。

ルアドレスの検出

str_detect("example@mail.com", "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")
output
TRUE (有効なメールアドレス)

の検出 (yyyy/mm/dd)

str_detect("2024/12/15", "\\d{4}/\\d{2}/\\d{2}")
output
TRUE (日付形式に一致)

番号の検出 (XXX-XXXX-XXXX)

str_detect("090-1234-5678", "\\d{3}-\\d{4}-\\d{4}")
output
TRUE (電話番号に一致)