正则表达式工具 |
grep |
语言和函数库 |
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 |
本网站上的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
使用 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。
gregexpr
与 regexpr
相同,但会找出每个字符串中的所有符合项。它会传回一个与输入矢量长度相同的矢量。每个元素都是另一个矢量,其中每个符合项有一个元素,表示找到该符合项的字符位置。传回矢量的每个矢量元素还有一个 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
取得正则表达式实际符合的子字符串。作为第一个参数,传递与传递给 regexpr
或 gregexpr
的相同的输入。作为第二个参数,传递 regexpr
或 gregexpr
传回的矢量。如果您传递 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"
您可以使用 和
将所有后向参照插入的文本变更为大写或小写。您可以使用
插入后向参照,而不会变更大小写。这些转义字符不会影响文本。
> 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"