本页面详细说明了 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-]
和 [-]
。
- 不合格的量词。即,没有前置项可匹配的量词,例如
*a
、a⎮?
、(+)
、{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 匹配 abc 、def 或 xyz |
字符类
特性 | 语法 | 描述 | 示例 |
字符类 | [ | [ 开始一个字符类。 | |
字面字符 | 除 \^-] 之外的任意字符 | 除列出的特殊字符外,所有字符都是字面字符,会将自身添加到字符类中。 | [abc] 匹配 a 、b 或 c |
反斜杠转义元字符 | \ (反斜杠) 后跟 \^-] 中的任意字符 | 反斜杠用于转义特殊字符,抑制其特殊含义。 | [\^\]] 匹配 ^ 或 ] |
范围 | - (连字符) 位于指定单个字符的两个标记之间。 | 向字符类添加字符范围。如果 '-' 是第一个或最后一个字符(例如 [a-] 或 [-z] ),它将匹配字面字符 '-',而不是推断范围。 | [a-zA-Z0-9] 匹配任何 ASCII 字母或数字 |
否定字符类 | ^ (脱字符) 紧跟在起始 [ 之后 | 否定字符类,使其匹配字符类中未列出的单个字符。 | [^a-d] 匹配 x (除 a 、b 、c 或 d 之外的任意字符) |
字面起始方括号 | [ | 起始方括号是一个字面字符,会将起始方括号添加到字符类中。 | [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] 匹配换页或制表符 |
简写字符类
锚点
特性 | 语法 | 描述 | 示例 |
字符串锚点 | ^ (脱字符) | 匹配字符串的开头 | ^. 匹配 abcdef 中的 a |
行锚点 | ^ (脱字符) | 当指定cudf::strings::regex_flags::MULTILINE 时:除匹配字符串开头外,还在每个换行符后进行匹配,因此匹配字符串中每行的开头。 | ^. 匹配 abc\ndef 中的 a 和 d |
字符串锚点 | $ (美元符) | 匹配字符串的末尾以及字符串中最后一个换行符之前的位置 | .$ 匹配 abcdef 和 abcdef\n 中的 f |
行锚点 | $ (美元符) | 当指定cudf::strings::regex_flags::MULTILINE 时:除匹配字符串末尾外,还在每个换行符之前进行匹配,因此匹配字符串中每行的末尾。 | .$ 匹配 abc\ndef 和 abc\ndef\n 中的 c 和 f |
字符串锚点 | \A | 匹配字符串的开头 | \A\w 仅匹配 abc 中的 a |
字符串锚点 | \Z | 匹配字符串的末尾 | \w\Z 匹配 abc\ndef 中的 f ,但不匹配 abc\ndef\n |
单词边界
特性 | 语法 | 描述 | 示例 |
单词边界 | \b | 匹配一个位置,该位置后跟单词字符但不前跟单词字符,或者前跟单词字符但不后跟单词字符。 | \b. 匹配 abc def 中的 a 、空格和 d |
单词边界 | \B | 匹配一个位置,该位置前后都跟单词字符,或者该位置前后都不跟单词字符。 | \B. 匹配 abc def 中的 b 、c 、e 和 f |
量词
特性 | 语法 | 描述 | 示例 |
贪婪量词 | ? (问号) | 使前一个项可选。贪婪匹配,因此如果可能,可选项会包含在匹配结果中。 | abc? 匹配 abc 或 ab |
贪婪量词 | * (星号) | 重复前一个项零次或多次。贪婪匹配,因此会匹配尽可能多的项,然后尝试前一个项匹配次数较少的排列组合,直到前一个项完全不匹配为止。 | ".*" 匹配 abc "def" "ghi" jkl 中的 "def" 和 "ghi" |
贪婪量词 | + (加号) | 重复前一个项一次或多次。贪婪匹配,因此会匹配尽可能多的项,然后尝试前一个项匹配次数较少的排列组合,直到前一个项仅匹配一次为止。 | ".+" 匹配 abc "def" "ghi" jkl 中的 "def" 和 "ghi" |
惰性量词 | ?? | 使前一个项可选。惰性匹配,因此如果可能,可选项会排除在匹配结果之外。 | abc?? 匹配 ab 或 abc |
惰性量词 | *? | 重复前一个项零次或多次。惰性匹配,因此引擎首先尝试跳过前一个项,然后尝试前一个项匹配次数不断增加的排列组合。 | ".*?" 匹配 abc "def" "ghi" jkl 中的 "def" 和 "ghi" |
惰性量词 | +? | 重复前一个项一次或多次。惰性匹配,因此引擎首先只匹配前一个项一次,然后尝试前一个项匹配次数不断增加的排列组合。 | ".+?" 匹配 abc "def" "ghi" jkl 中的 "def" 和 "ghi" |
固定量词 | {n} ,其中 n 是一个整数:0 ≤ n ≤ 999 | 精确重复前一个项 n 次。 | a{5} 匹配 aaaaa |
贪婪量词 | {n,m} ,其中 n 和 m 是整数:0 ≤ n ≤ m ≤ 999 | 重复前一个项 n 到 m 次。贪婪匹配,因此会先尝试重复 m 次,然后才减少重复次数到 n 次。 | a{2,4} 匹配 aaaa 、aaa 或 aa |
贪婪量词 | {n,} ,其中 n 是一个整数:0 ≤ n ≤ 999 | 重复前一个项至少 n 次。贪婪匹配,因此会匹配尽可能多的项,然后尝试前一个项匹配次数较少的排列组合,直到前一个项仅匹配 n 次为止。 | a{2,} 匹配 aaaaa 中的 aaaaa |
惰性量词 | {n,m}? ,其中 n 和 m 是整数:0 ≤ n ≤ m ≤ 999 | 重复前一个项 n 到 m 次。惰性匹配,因此会先尝试重复 n 次,然后才增加重复次数到 m 次。 | a{2,4}? 匹配 aa 、aaa 或 aaaa |
惰性量词 | {n,}? ,其中 n 是一个整数:0 ≤ n ≤ 999 | 重复前一个项 n 次或更多次。惰性匹配,因此引擎会先只匹配前一个项 n 次,然后尝试前一个项匹配次数不断增加的排列组合。 | a{2,}? 匹配 aaaaa 中的 aa |
分组
特性 | 语法 | 描述 | 示例 |
捕获组 | (regex) | 括号将括号内的 regex 分组。它们将 regex 匹配到的文本捕获到一个编号组中。它们允许您将 regex 运算符应用于整个分组的 regex。 | (abc⎮def)ghi 匹配 abcghi 或 defghi |
非捕获组 | (?:regex) | 非捕获括号将 regex 分组,以便您可以应用 regex 运算符,但不捕获任何内容。 | (?:abc⎮def)ghi 匹配 abcghi 或 defghi |
替换反向引用
特性 | 语法 | 描述 | 示例 |
反向引用 | \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 |