正则表达式功能#

本页面指定了当前由接受正则表达式模式的libcudf字符串列API支持的正则表达式(regex)功能:

  • cudf::strings::contains_re()

  • cudf::strings::matches_re()

  • cudf::strings::count_re()

  • cudf::strings::extract()

  • cudf::strings::extract_all_record()

  • cudf::strings::findall()

  • cudf::strings::find_re()

  • cudf::strings::replace_re()

  • cudf::strings::replace_with_backrefs()

  • cudf::strings::split_re()

  • cudf::strings::split_record_re()

详细信息基于在https://www.regular-expressions.info/reference.html上记录的功能。

注意: 交替字符是管道字符 |,而不是本页表格中包含的字符。在由doxygen渲染的表格markdown中包含管道字符时存在问题。

默认情况下,只有 \n 字符被识别为换行符。 [cudf::strings::regex_flags::EXT_NEWLINE](@ref cudf::strings::regex_flags) 增加了换行符的集合,包括:

  • 段落分隔符(Unicode:2029,UTF-8:E280A9

  • 行分隔符 (Unicode: 2028, UTF-8: E280A8)

  • 下一行 (Unicode: 0085, UTF-8: C285)

  • 回车符(Unicode:000D,UTF-8:0D

无效的正则表达式模式将导致未定义的行为。这包括但不限于以下情况:

  • 当特殊字符(列在下表字符表的第三行中)旨在作为字面量匹配时,不进行转义。

  • 未匹配的成对特殊字符,如 (), [], 和 {}

  • 空的组、类或量词。即,()[] 没有包含表达式,以及 {} 没有有效的整数。

  • 字符类中的不完整范围,如 [-z][a-][-]

  • 不合格的量词。也就是说,没有前面匹配项的量词,如 *a, a⎮?, (+), {2}a, 等。

支持的功能#

字符#

功能

语法

描述

示例

字面字符

除了 [\^$.⎮?*+() 之外的任何字符

除了列出的特殊字符外,所有字符都匹配它们自身的单个实例

a 匹配 a

字面量花括号

{}

{} 是字面量字符,除非它们是有效正则表达式标记的一部分,例如量词 {3}

{ 匹配 {

反斜杠转义元字符

\ 后跟 [\^$.⎮?*+(){} 中的任意一个

反斜杠转义特殊字符以抑制它们的特殊含义

\* 匹配 *

十六进制转义

\xFF 其中 FF 是2个十六进制数字

匹配ASCII表中指定位置的字符

\x40 匹配 @

字符转义

\n, \r\t

分别匹配换行符(LF)、回车符(CR)和制表符

\r\n 匹配Windows的CRLF换行符

字符转义

\a

匹配“警报”或“铃声”控制字符(ASCII 0x07)

字符转义

\f

匹配换页控制字符(ASCII 0x0C)

NULL 转义

\0

匹配 NULL 字符

八进制转义

\100\177
\200\377
\01\07
\010\077

匹配ASCII表中指定位置的字符

\100 匹配 @

基本功能#

功能

语法

描述

示例

. (点)

匹配除换行符之外的任何单个字符。可选择匹配换行符。当遇到\n字符时,点的行为可以通过cudf::strings::regex_flags来控制某些正则表达式API。

. 匹配x或(几乎)任何其他字符

交替

(管道)

使正则表达式引擎匹配左侧部分或右侧部分。可以串联成一系列交替。

abc⎮def⎮xyz 匹配 abc, defxyz

字符类#

功能

语法

描述

示例

字符类

[

[ 开始一个字符类。

字面字符

除了 \^-] 之外的任何字符

除了列出的特殊字符外,所有字符都是字面字符,它们会将自己添加到字符类中。

[abc] 匹配 a, bc

反斜杠转义元字符

\ (反斜杠) 后跟 \^-] 中的任意一个

反斜杠用于转义特殊字符,以抑制它们的特殊含义。

[\^\]] 匹配 ^]

范围

-(连字符)在两个指定单个字符的标记之间。

向字符类添加一系列字符。如果‘-’是第一个或最后一个字符(例如[a-][-z]),它将匹配字面的‘-’而不推断范围。

[a-zA-Z0-9] 匹配任何ASCII字母或数字

否定字符类

^ (插入符号) 紧接在开头的 [ 之后

否定字符类,使其匹配不在字符类中列出的单个字符。

[^a-d] 匹配 x (除了 a, b, cd 之外的任何字符)

字面量左括号

[

左方括号是一个字面量字符,它向字符类添加一个左方括号。

[ab[cd]ef] 匹配 aef], bef], [ef], cef], 和 def]

字符转义

\n, \r\t

分别向字符类添加一个换行符、回车符或制表符。

[\n\r\t] 匹配一个换行符、回车符或制表符

字符转义

\a

将“警报”或“铃声”控制字符(ASCII 0x07)添加到字符类中。

[\a\t] 匹配一个铃声或制表符

字符转义

\b

将退格控制字符(ASCII 0x08)添加到字符类中。

[\b\t] 匹配退格或制表符

字符转义

\f

将换页控制字符(ASCII 0x0C)添加到字符类中。

[\f\t] 匹配换页符或制表符

简写字符类#

功能

语法

描述

示例

简写

\d

将所有数字添加到字符类中。如果在字符类外部使用,则匹配单个数字。可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制行为,以仅包括[0-9]

\d 匹配一个数字字符

简写

\w

将所有单词字符添加到字符类中。如果在字符类外部使用,则匹配单个单词字符。可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制行为,以仅包括[0-9A-Za-z_]

\w 匹配任何单个单词字符

简写

\s

将所有空白字符添加到字符类中。如果在字符类外使用,则匹配单个空白字符。可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制行为,以仅包括[\t- ]

\s 匹配任何单个空白字符

简写

\D

将所有非数字字符添加到字符类中。如果在字符类外部使用,则匹配一个非数字字符。行为可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制

[\D] 匹配一个非数字字符

简写

\W

将所有非单词字符添加到字符类中。如果在字符类外部使用,则匹配一个非单词字符。行为可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制

[\W] 匹配一个非单词字符

简写

\S

将所有非空白字符添加到字符类中。如果在字符类外部使用,则匹配一个非空白字符。行为可以通过[cudf::strings::regex_flags::ASCII](@ref cudf::strings::regex_flags)控制。

[\S] 匹配一个非空白字符

锚点#

功能

语法

描述

示例

字符串锚点

^ (插入符号)

匹配字符串的开头

^. 匹配 aabcdef

行锚点

^ (插入符号)

当指定了 [cudf::strings::regex_flags::MULTILINE](@ref cudf::strings::regex_flags) 时:除了在字符串开头匹配外,还在每个换行符后匹配,从而匹配字符串中每行的开头。

^. 匹配 adabc\ndef

字符串锚点

$ (美元符号)

匹配字符串的末尾以及字符串中最后一个换行符之前的位置

.$abcdefabcdef\n 中匹配 f

行锚点

$ (美元符号)

当指定了[cudf::strings::regex_flags::MULTILINE](@ref cudf::strings::regex_flags)时:除了在字符串末尾匹配外,还在每个换行符前匹配,从而在字符串的每行末尾匹配。

.$abc\ndefabc\ndef\n 中匹配 cf

字符串锚点

\A

匹配字符串的开头

\A\w 仅在 abc 中匹配 a

字符串锚点

\Z

匹配字符串的末尾

\w\Zabc\ndef 中匹配 f,但在 abc\ndef\n 中无法匹配

单词边界#

功能

语法

描述

示例

单词边界

\b

匹配一个位置,该位置后面是一个单词字符但前面不是单词字符,或者前面是一个单词字符但后面不是单词字符。

\b. 匹配 a、空格和 dabc def

单词边界

\B

匹配一个位置,该位置前后都是单词字符,或者前后都不是单词字符。

\B. 匹配 b, c, e, 和 fabc def

量词#

功能

语法

描述

示例

贪婪量词

? (问号)

使前面的项可选。贪婪的,因此如果可能,可选项会包含在匹配中。

abc? 匹配 abcab

贪婪量词

* (星号)

重复前一个项目零次或多次。贪婪模式,尽可能多地匹配项目,直到尝试减少前一个项目的匹配次数,直到前一个项目完全不匹配为止。

".*" 匹配 "def""ghi"abc "def" "ghi" jkl

贪婪量词

+ (加号)

重复前一个项目一次或多次。贪婪模式,因此会尽可能多地匹配项目,然后再尝试匹配较少的项目,直到前一个项目只匹配一次。

".+" 匹配 "def""ghi"abc "def" "ghi" jkl

懒惰量词

??

使前面的项变为可选项。懒惰模式,因此如果可能的话,可选项在匹配时会被排除。

abc?? 匹配 ababc

懒惰量词

*?

重复前一个项目零次或多次。懒惰模式,引擎首先尝试跳过前一个项目,然后再尝试增加前一个项目的匹配次数。

".*?"abc "def" "ghi" jkl 中匹配 "def""ghi"

懒惰量词

+?

重复前一项一次或多次。懒惰模式,因此引擎首先只匹配前一项一次,然后尝试逐步增加前一项的匹配次数。

".+?"abc "def" "ghi" jkl 中匹配 "def""ghi"

固定量词

{n} 其中 n 是一个整数:0 n 999

将前一个项目重复恰好 n 次。

a{5} 匹配 aaaaa

贪婪量词

{n,m} 其中 nm 是整数:0 n m 999

重复前一个项目 nm 次。贪婪模式,因此会先尝试重复 m 次,然后再减少到 n 次。

a{2,4} 匹配 aaaa, aaaaa

贪婪量词

{n,} 其中 n 是一个整数:0 n 999

重复前一个项目至少 n 次。贪婪的,因此会尽可能多地匹配项目,然后尝试匹配较少的项目,直到前一个项目只匹配 n 次。

a{2,}aaaaa 中匹配 aaaaa

懒惰量词

{n,m}? 其中 nm 是整数 0 n m 999

重复前一个项目在 nm 次之间。懒惰的,因此在增加到 m 次之前,先尝试重复 n 次。

a{2,4}? 匹配 aa, aaa, 或 aaaa

懒惰量词

{n,}? 其中 n 是一个整数:0 n 999

重复前一个项目 n 次或更多次。懒惰模式,因此引擎首先匹配前一个项目 n 次,然后尝试增加前一个项目的匹配次数。

a{2,}?aaaaa 中匹配 aa

分组#

功能

语法

描述

示例

捕获组

(regex)

括号将它们之间的正则表达式分组。它们将匹配的正则表达式捕获到一个编号的组中。它们允许您将正则表达式运算符应用于整个分组的正则表达式。

(abc⎮def)ghi 匹配 abcghidefghi

非捕获组

(?:regex)

非捕获括号将正则表达式分组,以便您可以应用正则表达式操作符,但不捕获任何内容。

(?:abc⎮def)ghi 匹配 abcghidefghi

替换反向引用#

功能

语法

描述

示例

反向引用

\1\99

插入由捕获组1到99匹配的文本

abc 中将 (a)(b)(c) 替换为 \3\3\1 会得到 cca

反向引用

${1}${99}

插入由捕获组1到99匹配的文本

abc 中将 (a)(b)(c) 替换为 ${2}.${2}:{$3} 会得到 b.b:c

完全匹配

${0}

插入整个正则表达式匹配的内容

123abc 中将 (\d)(a) 替换为 [${0}]:-${2}_${1}; 会得到 12[3a]:-a_3;bc