正则表达式函数
所有正则表达式函数都使用Java模式语法,但有一些值得注意的例外:
- 当使用多行模式(通过
(?m)
标志启用)时,仅将\n
识别为行终止符。此外,不支持(?d)
标志,不得使用该标志。 - 不区分大小写的匹配(通过
(?i)
标志启用)始终以支持Unicode的方式执行。不过,不支持上下文相关和局部相关的匹配。此外,不支持(?u)
标志,不得使用该标志。 - 不支持代理项对。例如,
\uD800\uDC00
不被视为U+10000
,必须将其指定为\x{10000}
。对于没有基字符的不占位标记,会错误地处理边界(\b
)。 - 在字符类(如
[A-Z123]
)中不支持\Q
和\E
,而应将其视为字面量。 - 支持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)
查找string
中出现的所有正则表达式pattern
实例并返回捕获组编号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
查找string
中出现的第一个正则表达式pattern
实例并返回捕获组编号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
将string
中由正则表达式pattern
匹配的子字符串的每个实例替换为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 expression <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, ]