正则表达式特性#

此页面详细说明了 libcudf 字符串列 API 当前支持的正则表达式 (regex) 特性,这些 API 接受正则表达式模式

  • 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://regexper.cn/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)

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

  • 当特殊字符(列在下面 Characters 表的第三行)意图匹配为字面值时未转义。

  • 不成对的特殊字符,如 ()[]{}

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

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

  • 不合格的量词。即,没有先行匹配项的量词,如 *aa⎮?(+){2}a 等。

支持的特性#

字符#

特性

语法

描述

示例

字面字符

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

除了列出的特殊字符之外的所有字符都匹配其自身的一个实例

a 匹配 a

字面大括号

{}

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

{ 匹配 {

反斜杠转义元字符

\ 后跟 [\^$.⎮?*+(){} 中的任何字符

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

\* 匹配 *

十六进制转义

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

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

\x40 匹配 @

字符转义

\n\r\t

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

\r\n 匹配 Windows CRLF 换行符

字符转义

\a

匹配“alert”或“bell”控制字符 (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 匹配 abcdefxyz

字符类#

特性

语法

描述

示例

字符类

[

[ 开始一个字符类。

字面字符

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

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

[abc] 匹配 abc

反斜杠转义元字符

\ (反斜杠) 后跟 \^-] 中的任何字符

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

[\^\]] 匹配 ^]

范围

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

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

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

否定字符类

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

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

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

字面左括号

[

左方括号是一个字面字符,它将左方括号添加到字符类中。

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

字符转义

\n\r\t

分别向字符类添加 LF 字符、CR 字符或制表符。

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

字符转义

\a

向字符类添加“alert”或“bell”控制字符 (ASCII 0x07)。

[\a\t] 匹配 bell 字符或制表符

字符转义

\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] 匹配一个非空白字符

锚点#

特性

语法

描述

示例

字符串锚点

^ (插入符号)

匹配字符串的开头

^. 匹配 abcdef 中的 a

行锚点

^ (插入符号)

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

^. 匹配 abc\ndef 中的 ad

字符串锚点

$ (美元符号)

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

.$ 匹配 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\Z 匹配 abc\ndef 中的 f,但无法匹配 abc\ndef\n

特性

语法

描述

示例

单词边界#

\b

单词边界

\b

单词边界#

匹配前面是单词字符而后面不是单词字符,或者前面不是单词字符而后面是单词字符的位置。

\b. 匹配 abc def 中的 a、空格和 d

\B

匹配前面和后面都是单词字符,或者前面和后面都不是单词字符的位置。

特性

语法

描述

示例

\B. 匹配 abc def 中的 bcef

量词#

贪婪量词

? (问号)

\B. 匹配 abc def 中的 bcef

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

abc? 匹配 abcab

* (星号)

\B. 匹配 abc def 中的 bcef

重复前面的项零次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项根本不匹配为止。

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

+ (加号)

重复前面的项一次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配一次为止。

??

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

惰性量词

重复前面的项一次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配一次为止。

*?

??

使前面的项可选。惰性匹配,因此如果可能,可选项目会排除在匹配之外。

重复前面的项一次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配一次为止。

+?

abc?? 匹配 ababc

.*?

重复前面的项零次或多次。惰性匹配,因此引擎首先尝试跳过前面的项,然后尝试匹配越来越多的前面的项的排列。

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

+?

重复前面的项一次或多次。惰性匹配,因此引擎首先仅匹配前面的项一次,然后尝试匹配越来越多的前面的项的排列。

\B. 匹配 abc def 中的 bcef

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

固定量词

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

\B. 匹配 abc def 中的 bcef

精确重复前面的项 n 次。

a{5} 匹配 aaaaa

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

重复前面的项一次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配一次为止。

重复前面的项 nm 次之间。贪婪匹配,因此会先尝试重复 m 次,然后再减少重复次数到 n 次。

a{2,4} 匹配 aaaaaaaaa

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

重复前面的项一次或多次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配一次为止。

重复前面的项至少 n 次。贪婪匹配,因此会尽可能多地匹配项目,然后尝试匹配较少前面的项的排列,直到前面的项仅匹配 n 次为止。

a{2,} 匹配 aaaaa 中的 aaaaa

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

重复前面的项 nm 次之间。惰性匹配,因此会先尝试重复 n 次,然后再增加重复次数到 m 次。

特性

语法

描述

示例

a{2,4}? 匹配 aaaaaaaaa

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

重复前面的项 n 次或更多次。惰性匹配,因此引擎首先匹配前面的项 n 次,然后尝试匹配越来越多的前面的项的排列。

a{2,}? 匹配 aaaaa 中的 aa

分组#

捕获组

(regex)

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

(abc⎮def)ghi 匹配 abcghidefghi

特性

语法

描述

示例

非捕获组

(?:regex)

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

(?:abc⎮def)ghi 匹配 abcghidefghi

非捕获组

替换反向引用#

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

反向引用

\1\99

${0}

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

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

${1}${99}