快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
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 模式
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—The best regex editor and tester for R developers!

R 语言中的正则表达式

用于统计计算的 R 项目在其 base 包中提供了七个正则表达式函数。R 文档声称默认风格实现了 POSIX 扩展正则表达式。这是不正确的。在 R 2.10.0 及更高版本中,默认 regex 引擎是 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 除了替换所有匹配项外,其工作方式与 sub 完全相同,并且采用完全相同的参数。

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 |