快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
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 Feed 和部落格
RegexBuddy—The best regex editor and tester for R developers!

使用 R 語言的正規表示式

統計運算的 R 專案在其 base 套件中提供了七個正規表示式函式。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 函數將你的正規表示式當作第一個引數,將輸入向量當作第二個引數。如果你傳遞 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 相同的引數。regexpr 會傳回一個整數向量,其長度與輸入向量相同。傳回向量中的每個元素會指出輸入向量中對應的每個字串元素中找到(第一個)正規表示式比對的字元位置。字串開頭的比對會以字元位置 1 指出。如果正規表示式無法在特定字串中找到比對,則它在結果向量中的對應元素會是 -1。傳回的向量還有一個 match.length 屬性。這是另一個整數向量,其中包含每個字串中(第一個)正規表示式比對的字元數,或對於未比對的字串則包含 -1。

gregexprregexpr 相同,但會找出每個字串中的所有符合項。它會傳回一個與輸入向量長度相同的向量。每個元素都是另一個向量,其中每個符合項有一個元素,表示找到該符合項的字元位置。傳回向量的每個向量元素還有一個 match.length 屬性,其中包含所有符合項的長度。如果在特定字串中找不到任何符合項,傳回向量中的元素仍然是一個向量,但只有一個元素 -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 取得正規表示式實際符合的子字串。作為第一個參數,傳遞與傳遞給 regexprgregexpr 的相同的輸入。作為第二個參數,傳遞 regexprgregexpr 傳回的向量。如果您傳遞 regexpr 的向量,則 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 函數有三個必要參數:一個包含正規表示式的字串、一個包含取代文字的字串,以及輸入向量。 sub 會傳回一個與輸入向量長度相同的新向量。如果在字串元素中找到正規表示式符合項,則會以取代文字取代它。只會取代每個字串元素中的第一個符合項。如果在某些字串中找不到符合項,則會將這些字串不變地複製到結果向量中。

使用 gsub 取代向量中所有字串元素中的所有正規表示式符合項,而不是 sub。除了取代所有符合項之外,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"

執行取代的強大方式是在呼叫 gregexpr 的結果中,將新的向量指定給 regmatches 函數。您指定的向量應該與原始輸入向量有相同數量的元素。每個元素應為字元向量,且字串數量與該元素中的比對數量相同。然後會修改原始輸入向量,將所有正規表示式比對替換為新向量中的文字。

> 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 |