クイック スタート
チュートリアル
ツール & 言語
リファレンス
書籍レビュー
正規表現ツール
grep
PowerGREP
RegexBuddy
RegexMagic
一般的なアプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery & XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトの他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for R developers!

R言語における正規表現

統計計算のためのRプロジェクトは、そのbaseパッケージに7つの正規表現関数を提供しています。Rのドキュメントでは、デフォルトのフレーバーがPOSIX拡張正規表現を実装していると主張しています。それは正しくありません。R 2.10.0以降では、デフォルトの正規表現エンジンは、Ville LaurikariのTREエンジンの修正版です。これはPOSIXを模倣していますが、多くの微妙で、微妙でない方法で標準から逸脱しています。このウェブサイトがPOSIX EREについて述べていることは、Rには(必ずしも)適用されません。

以前のバージョンのRでは、GNUライブラリを使用して、POSIX BREとEREの両方を実装していました。EREがデフォルトでした。extended=FALSEパラメーターを渡すと、BREに切り替えることができました。このパラメーターはR 2.10.0で非推奨になり、R 2.11.0で削除されました。

Rで正規表現を使用する最良の方法は、perl=TRUEパラメーターを渡すことです。これは、RにPCRE正規表現ライブラリを使用するように指示します。このウェブサイトがRについて語るときは、perl=TRUEパラメーターを使用していることを前提としています。R 4.0.0以降では、perl=TRUEを渡すと、RはPCRE2ライブラリを使用します。

すべての関数は、デフォルトで大文字と小文字を区別するマッチングを使用します。ignore.case=TRUEを渡すと、大文字と小文字を区別しなくなります。Rの関数には、他のマッチングモードを設定するためのパラメーターはありません。perl=TRUEを使用するときは、正規表現の先頭にモード修飾子を追加できます。

文字列ベクターでの正規表現マッチの検索

grep 関数は、正規表現を最初の引数として、入力ベクターを2番目の引数として受け取ります。value=FALSEを渡すか、valueパラメーターを省略すると、grepは、正規表現によって(部分的に)マッチングできた入力ベクターの要素のインデックスを持つ新しいベクターを返します。value=TRUEを渡すと、grepは、(部分的に)マッチングできた入力ベクター内の実際の要素のコピーを持つベクターを返します。

> grep("a+", c("abc", "def", "cba a", "aa"), perl=TRUE, value=FALSE)
[1] 1     3       4
> grep("a+", c("abc", "def", "cba a", "aa"), perl=TRUE, value=TRUE)
[1] "abc" "cba a" "aa"

grepl 関数は、grep関数と同じ引数を受け取ります。ただし、value引数はサポートされていません。greplは、入力ベクターと同じ長さの論理ベクターを返します。返されたベクターの各要素は、入力ベクター内の対応する文字列要素で正規表現が一致を見つけることができたかどうかを示します。

> grepl("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] TRUE  FALSE TRUE  TRUE

regexpr 関数は、grepl. と同じ引数を受け取ります。regexprmatch.length属性もあります。これは、各文字列での正規表現の(最初)の一致における文字数、または一致しなかった文字列の場合は-1を持つ別の整数ベクターです。

gregexpr は、と同じ引数を受け取ります。と同じですが、各文字列で全ての一致を見つける点が異なります。入力ベクターと同じ長さのベクターを返します。各要素は別のベクターで、その文字列で見つかった一致ごとに1つの要素があり、その一致が見つかった文字位置を示します。返されたベクターの各ベクター要素には、全ての一致の長さを格納したmatch.length属性もあります。特定の文字列で一致が見つからなかった場合でも、返されたベクターの要素は依然としてベクターですが、要素は1つのみで、-1となります。

> regexpr("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1]  1 -1  3  1
attr(,"match.length")
[1]  1 -1  1  2
> gregexpr("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
[[1]]  [1] 1    attr(,"match.length")  [1] 1
[[2]]  [1] -1   attr(,"match.length")  [1] -1
[[3]]  [1] 3 5  attr(,"match.length")  [1] 1 1
[[4]]  [1] 1    attr(,"match.length")  [1] 2

regmatches を使用して、正規表現に一致した実際のサブストリングを取得します。最初の引数として、と同じ引数を受け取ります。またはgregexprに渡したものと同じ入力を渡します。2番目の引数として、と同じ引数を受け取ります。またはgregexprによって返されたベクターを渡します。と同じ引数を受け取ります。からベクターを渡すと、regmatchesは、一致したすべての文字列を持つ文字列ベクターを返します。一部の要素で一致が見つからなかった場合、このベクターは入力ベクターよりも短くなる可能性があります。gregexprからベクターを渡すと、regmatchesからベクターを渡すと、入力ベクターと同じ数の要素を持つベクターを返します。各要素は、入力ベクターの対応する要素の全ての一致を持つ文字列ベクター、または要素に一致がない場合はNULLになります。

>x <- c("abc", "def", "cba a", "aa")
> m <- regexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[1]  "a"  "a"  "aa"
> m <- gregexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[[1]]  [1] "a"
[[2]]  character(0)
[[3]]  [1] "a"   "a"
[[4]]  [1] "aa"

文字列ベクターでの正規表現マッチの置換

sub 関数には、正規表現を含む文字列、置換テキストを含む文字列、および入力ベクターという3つの必須パラメーターがあります。subは、入力ベクターと同じ長さの新しいベクターを返します。文字列要素で正規表現の一致が見つかった場合、それは置換テキストに置き換えられます。各文字列要素内で最初の一致のみが置き換えられます。一部の文字列で一致が見つからなかった場合、それらは変更されずに結果ベクターにコピーされます。

ベクター内のすべての文字列要素内のすべての正規表現一致を置き換えるには、subの代わりに gsub を使用します。全ての一致を置き換えることを除いて、gsubはまったく同じように動作し、まったく同じ引数を受け取ります。

Rは独自の置換文字列構文を使用します。R 4.0.0は、perl=TRUEを渡すときにPCRE2正規表現フレーバーを使用しますが、依然としてRの置換文字列構文を使用します。PCRE2の置換文字列構文を使用するオプションはありません。

後方参照\1から\9を、キャプチャグループによってマッチされたテキストを再挿入するために置換テキストで使用できます。10番目以降のグループへの後方参照は使用できません。正規表現に名前付きグループがある場合は、最初の9つのグループへの番号付き後方参照を使用できます。全体一致に対する置換テキストトークンはありません。正規表現全体をキャプチャグループに入れ、次に\1を使用して、正規表現全体の一致を挿入します。

> sub("(a+)", "z\\1z", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] "zazbc"  "def"  "cbzaz a"   "zaaz"
> gsub("(a+)", "z\\1z", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] "zazbc"  "def"  "cbzaz zaz" "zaaz"

次の\U\Lを使用すると、後続の全ての後方参照によって挿入されるテキストを大文字または小文字に変更できます。次の\Eを使用すると、後続の後方参照をケース変更なしで挿入できます。これらのエスケープは、リテラルテキストには影響しません。

> sub("(a+)", "z\\U\\1z", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] "zAzbc"  "def"  "cbzAz a"   "zAAz"
> gsub("(a+)", "z\\U\\1z", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] "zAzbc"  "def"  "cbzAz zAz" "zAAz"

置換を行う非常に強力な方法は、regmatches関数の結果に対して呼び出したときに、新しいベクターをgregexprに割り当てることです。割り当てるベクターは、元の入力ベクターと同じ数の要素を持つ必要があります。各要素は、その要素内で一致する数と同じ数の文字列を持つ文字列ベクターである必要があります。その後、元の入力ベクターは、すべての正規表現の一致が新しいベクターからのテキストに置き換えられるように変更されます。

> x <- c("abc", "def", "cba a", "aa")
> m <- gregexpr("a+", x, perl=TRUE)
> regmatches(x, m) <- list(c("one"), character(0), c("two", "three"), c("four"))
> x
[1]  "onebc"       "def"         "cbtwo three" "four"

| クイック スタート | チュートリアル | ツール & 言語 |  | リファレンス | 書籍レビュー |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |