正则表达式函数¶
所有正则表达式函数都使用 Java 模式 语法,但也有一些显著的例外。
使用多行模式时(通过
(?m)
标志启用),只有\n
被识别为行终止符。此外,不支持(?d)
标志,不能使用。不区分大小写的匹配(通过
(?i)
标志启用)始终以 Unicode 敏感的方式执行。但是,不支持上下文敏感和本地敏感匹配。此外,不支持(?u)
标志,不能使用。不支持代理对。例如,
\uD800\uDC00
不被视为U+10000
,必须指定为\x{10000}
。边界 (
\b
) 在没有基字符的非间距标记中处理不正确。\Q
和\E
不支持字符类(如[A-Z123]
),而是作为文字处理。Unicode 字符类 (
\p{prop}
) 支持以下差异名称中的所有下划线必须删除。例如,使用
OldItalic
而不是Old_Italic
。脚本必须直接指定,无需
Is
、script=
或sc=
前缀。示例:\p{Hiragana}
块必须使用
In
前缀指定。不支持block=
和blk=
前缀。示例:\p{Mongolian}
类别必须直接指定,无需
Is
、general_category=
或gc=
前缀。示例:\p{L}
二进制属性必须直接指定,无需
Is
。示例:\p{NoncharacterCodePoint}
- regexp_extract_all(string, pattern) -> array(varchar)¶
返回正则表达式
pattern
在string
中匹配的子字符串。SELECT regexp_extract_all('1a 2b 14m', '\d+'); -- [1, 2, 14]
- regexp_extract_all(string, pattern, group) -> array(varchar)¶
查找正则表达式
pattern
在string
中的所有出现情况,并返回 捕获组号group
。SELECT regexp_extract_all('1a 2b 14m', '(\d+)([a-z]+)', 2); -- ['a', 'b', 'm']
- regexp_extract(string, pattern) -> varchar()¶
返回正则表达式
pattern
在string
中匹配的第一个子字符串。SELECT regexp_extract('1a 2b 14m', '\d+'); -- 1
- regexp_extract(string, pattern, group) -> varchar()¶
查找正则表达式
pattern
在string
中的第一个出现情况,并返回 捕获组号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, ]