正则表达式特性

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

详细信息基于以下网站文档的特性:https://regexper.cn/reference.html

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

默认情况下,只有 \n 字符被识别为换行符。通过cudf::strings::regex_flags::EXT_NEWLINE 可以将换行符集扩展为包括

  • 段落分隔符 (Unicode: 2029, UTF-8: E280A9)
  • 行分隔符 (Unicode: 2028, UTF-8: E280A8)
  • 下一行 (Unicode: 0085, UTF-8: C285)
  • 回车符 (Unicode: 000D, UTF-8: 0D)

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

  • 未转义的特殊字符(列在下方字符表格的第三行),当它们打算按字面意义匹配时。
  • 不成对的特殊字符,例如 ()[]{}
  • 空的组、类或量词。即,没有包含表达式的 ()[],以及没有有效整数的 {}
  • 字符类中不完整的范围,例如 [-z][a-][-]
  • 不合格的量词。即,没有前置项可匹配的量词,例如 *aa⎮?(+){2}a 等。

支持的特性

字符

特性语法描述示例
字面字符[\^$.⎮?*+() 之外的任意字符除列出的特殊字符外,所有字符都匹配自身的一个实例a 匹配 a
字面花括号{}{} 是字面字符,除非它们是有效正则表达式标记的一部分,例如量词 {3}{ 匹配 {
反斜杠转义元字符\ 后跟 [\^$.⎮?*+(){} 中的任意字符反斜杠用于转义特殊字符,抑制其特殊含义\* 匹配 *
十六进制转义\xFF,其中 FF 是两位十六进制数字匹配 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 控制,适用于某些 regex API。. 匹配 x 或 (几乎) 任何其他字符
交替 (管道符)使 regex 引擎匹配左侧部分或右侧部分。可以串联成一系列交替。abc⎮def⎮xyz 匹配 abcdefxyz

字符类

特性语法描述示例
字符类[ [ 开始一个字符类。
字面字符\^-] 之外的任意字符除列出的特殊字符外,所有字符都是字面字符,会将自身添加到字符类中。[abc] 匹配 abc
反斜杠转义元字符\ (反斜杠) 后跟 \^-] 中的任意字符反斜杠用于转义特殊字符,抑制其特殊含义。[\^\]] 匹配 ^]
范围- (连字符) 位于指定单个字符的两个标记之间。向字符类添加字符范围。如果 '-' 是第一个或最后一个字符(例如 [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 将“警报”或“响铃”控制字符 (ASCII 0x07) 添加到字符类中。[\a\t] 匹配响铃或制表符
字符转义\b 将退格控制字符 (ASCII 0x08) 添加到字符类中。[\b\t] 匹配退格或制表符
字符转义\f 将换页控制字符 (ASCII 0x0C) 添加到字符类中。[\f\t] 匹配换页或制表符

简写字符类

特性语法描述示例
简写\d 将所有数字添加到字符类中。如果在字符类外部使用,则匹配单个数字。其行为可通过cudf::strings::regex_flags::ASCII 控制,仅包括 [0-9]\d 匹配数字字符
简写\w 将所有单词字符添加到字符类中。如果在字符类外部使用,则匹配单个单词字符。其行为可通过cudf::strings::regex_flags::ASCII 控制,仅包括 [0-9A-Za-z_]\w 匹配任何单个单词字符
简写\s 将所有空白字符添加到字符类中。如果在字符类外部使用,则匹配单个空白字符。其行为可通过cudf::strings::regex_flags::ASCII 控制,仅包括 [\t- ]\s 匹配任何单个空白字符
简写\D 将所有非数字添加到字符类中。如果在字符类外部使用,则匹配单个非数字字符。其行为可通过cudf::strings::regex_flags::ASCII[\D] 匹配单个非数字字符
简写\W 将所有非单词字符添加到字符类中。如果在字符类外部使用,则匹配单个非单词字符。其行为可通过cudf::strings::regex_flags::ASCII[\W] 匹配单个非单词字符
简写\S 将所有非空白字符添加到字符类中。如果在字符类外部使用,则匹配单个非空白字符。其行为可通过cudf::strings::regex_flags::ASCII[\S] 匹配单个非空白字符

锚点

特性语法描述示例
字符串锚点^ (脱字符)匹配字符串的开头^. 匹配 abcdef 中的 a
行锚点^ (脱字符)当指定cudf::strings::regex_flags::MULTILINE 时:除匹配字符串开头外,还在每个换行符后进行匹配,因此匹配字符串中每行的开头。^. 匹配 abc\ndef 中的 ad
字符串锚点$ (美元符)匹配字符串的末尾以及字符串中最后一个换行符之前的位置.$ 匹配 abcdefabcdef\n 中的 f
行锚点$ (美元符)当指定cudf::strings::regex_flags::MULTILINE 时:除匹配字符串末尾外,还在每个换行符之前进行匹配,因此匹配字符串中每行的末尾。.$ 匹配 abc\ndefabc\ndef\n 中的 cf 
字符串锚点\A 匹配字符串的开头\A\w 仅匹配 abc 中的 a
字符串锚点\Z 匹配字符串的末尾\w\Z 匹配 abc\ndef 中的 f,但不匹配 abc\ndef\n

单词边界

特性语法描述示例
单词边界\b 匹配一个位置,该位置后跟单词字符但不前跟单词字符,或者前跟单词字符但不后跟单词字符。\b. 匹配 abc def 中的 a、空格和 d
单词边界\B 匹配一个位置,该位置前后都跟单词字符,或者该位置前后都不跟单词字符。\B. 匹配 abc def 中的 bcef

量词

特性语法描述示例
贪婪量词? (问号)使前一个项可选。贪婪匹配,因此如果可能,可选项会包含在匹配结果中。abc? 匹配 abcab
贪婪量词* (星号)重复前一个项零次或多次。贪婪匹配,因此会匹配尽可能多的项,然后尝试前一个项匹配次数较少的排列组合,直到前一个项完全不匹配为止。".*" 匹配 abc "def" "ghi" jkl 中的 "def""ghi"
贪婪量词+ (加号) 重复前一个项一次或多次。贪婪匹配,因此会匹配尽可能多的项,然后尝试前一个项匹配次数较少的排列组合,直到前一个项仅匹配一次为止。".+" 匹配 abc "def" "ghi" jkl 中的 "def""ghi"
惰性量词?? 使前一个项可选。惰性匹配,因此如果可能,可选项会排除在匹配结果之外。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} 匹配 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) 括号将括号内的 regex 分组。它们将 regex 匹配到的文本捕获到一个编号组中。它们允许您将 regex 运算符应用于整个分组的 regex。(abc⎮def)ghi 匹配 abcghidefghi
非捕获组(?:regex) 非捕获括号将 regex 分组,以便您可以应用 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} 插入整个 regex 匹配结果123abc 中的 (\d)(a) 替换为 [${0}]:-${2}_${1}; 将得到 12[3a]:-a_3;bc