正则表达式函数

所有正则表达式函数都使用 Java 模式 语法,但也有一些显著的例外。

  • 使用多行模式时(通过 (?m) 标志启用),只有 \n 被识别为行终止符。此外,不支持 (?d) 标志,不能使用。

  • 不区分大小写的匹配(通过 (?i) 标志启用)始终以 Unicode 敏感的方式执行。但是,不支持上下文敏感和本地敏感匹配。此外,不支持 (?u) 标志,不能使用。

  • 不支持代理对。例如,\uD800\uDC00 不被视为 U+10000,必须指定为 \x{10000}

  • 边界 (\b) 在没有基字符的非间距标记中处理不正确。

  • \Q\E 不支持字符类(如 [A-Z123]),而是作为文字处理。

  • Unicode 字符类 (\p{prop}) 支持以下差异

    • 名称中的所有下划线必须删除。例如,使用 OldItalic 而不是 Old_Italic

    • 脚本必须直接指定,无需 Isscript=sc= 前缀。示例:\p{Hiragana}

    • 块必须使用 In 前缀指定。不支持 block=blk= 前缀。示例:\p{Mongolian}

    • 类别必须直接指定,无需 Isgeneral_category=gc= 前缀。示例:\p{L}

    • 二进制属性必须直接指定,无需 Is。示例:\p{NoncharacterCodePoint}

regexp_extract_all(string, pattern) -> array(varchar)

返回正则表达式 patternstring 中匹配的子字符串。

SELECT regexp_extract_all('1a 2b 14m', '\d+'); -- [1, 2, 14]
regexp_extract_all(string, pattern, group) -> array(varchar)

查找正则表达式 patternstring 中的所有出现情况,并返回 捕获组号 group

SELECT regexp_extract_all('1a 2b 14m', '(\d+)([a-z]+)', 2); -- ['a', 'b', 'm']
regexp_extract(string, pattern) -> varchar()

返回正则表达式 patternstring 中匹配的第一个子字符串。

SELECT regexp_extract('1a 2b 14m', '\d+'); -- 1
regexp_extract(string, pattern, group) -> varchar()

查找正则表达式 patternstring 中的第一个出现情况,并返回 捕获组号 group

SELECT regexp_extract('1a 2b 14m', '(\d+)([a-z]+)', 2); -- 'a'
regexp_like(string, pattern) -> boolean()

评估正则表达式 pattern 并确定它是否包含在 string 中。

此函数类似于 LIKE 运算符,不同之处在于模式只需要包含在 string 中,而不需要匹配 string 的全部内容。换句话说,这执行的是“包含”操作而不是“匹配”操作。可以通过使用 ^$ 锚定模式来匹配整个字符串。

SELECT regexp_like('1a 2b 14m', '\d+b'); -- true
regexp_replace(string, pattern) -> varchar()

string 中删除正则表达式 pattern 匹配的子字符串的每个实例。

SELECT regexp_replace('1a 2b 14m', '\d+[ab] '); -- '14m'
regexp_replace(string, pattern, replacement) -> varchar()

使用正则表达式 pattern 匹配到的子字符串,在 string 中替换为 replacement捕获组 可以使用 $g(对于编号组)或 ${name}(对于命名组)在 replacement 中引用。美元符号 ($) 可以通过在前面加反斜杠 (\$) 来包含在替换中。

SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 '); -- '3ca 3cb 14m'
regexp_replace(string, pattern, function) -> varchar()

使用 function 替换 string 中由正则表达式 pattern 匹配到的所有子字符串。对于每个匹配项,lambda 表达式 function 将被调用,并以数组形式传递 捕获组。捕获组编号从 1 开始;整个匹配项没有组(如果您需要它,请将整个表达式用括号括起来)。

SELECT regexp_replace('new york', '(\w)(\w*)', x -> upper(x[1]) || lower(x[2])); --'New York'
regexp_split(string, pattern) -> array(varchar)

使用正则表达式 pattern 拆分 string,并返回一个数组。尾随的空字符串将被保留。

SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- [1, 2, 14, ]