文档首页/
MapReduce服务 MRS/
组件操作指南(LTS版)/
使用HetuEngine/
HetuEngine常见SQL语法说明/
HetuEngine SQL函数和操作符说明/
正则表达式函数
更新时间:2024-07-24 GMT+08:00
正则表达式函数
概述
所有的正则表达式函数都使用Java样式的语法。但以下情况除外:
- 使用多行模式(通过(?m)标志启用)时,只有\ n被识别为行终止符。 此外,不支持(?d)标志,因此不能使用。
- 大小写区分模式(通过(?i)标志启用)时,总是以unicode的模式去实现。同时,不支持上下文敏感匹配和局部敏感匹配。此外,不支持(?u)标志。
- 不支持Surrogate Pair编码方式。例如,\ 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_count(string, pattern) → bigint
描述:返回字符串中pattern匹配的次数。
SELECT regexp_count('1a 2b 14m', '\s*[a-z]+\s*'); -- 3
- regexp_extract_all(string, pattern) -> array(varchar)
SELECT regexp_extract_all('1a 2b 14m','\d+');-- [1, 2, 14]
- regexp_extract_all(string, pattern, group) -> array(varchar)
描述:当pattern包含多个分组时,用group指定返回满足被捕获分组的所有子串。
SELECT regexp_extract_all('1a 2b 14m','(\d+)([a-z]+)',2);-- [a, b, m]
- regexp_extract(string, pattern) → varchar
SELECT regexp_extract('1a 2b 14m','\d+');-- 1
- regexp_extract(string, pattern, group) → varchar
描述:当pattern包含多个分组时,用group指定返回满足被捕获分组的第一个子字符串。
SELECT regexp_extract('1a 2b 14m','(\d+)([a-z]+)',2);-- 'a'
- regexp_like(string, pattern) → boolean
描述:验证字符串是否包含满足正则表达式的子串,如果有,返回true。
SELECT regexp_like('1a 2b 14m','\d+b');-- true
- regexp_position(string, pattern) → integer
描述:返回字符串中pattern第一次匹配到的索引。没有匹配的项则返回-1。
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b'); -- 8
- regexp_position(string, pattern, start) → integer
描述:返回字符串从start(含start)开始pattern第一次匹配到的项的索引。没有匹配的项则返回-1。
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 5); -- 8 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12); -- 19
- regexp_position(string, pattern, start, occurrence) → integer
描述:返回字符串中从索引start(含start)开始,pattern第occurrence次匹配到的项的索引。没有匹配的项则返回-1。
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,1);-- 19 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,2);-- 31 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,3);-- -1
- regexp_replace(string, pattern) → varchar
SELECT regexp_replace('1a 2b 14m','\d+[ab] ');-- '14m'
- regexp_replace(string, pattern, replacement) → varchar
描述:使用replacement替换目标字符串中满足正则表达式的子串。如果replacement中包含'$'字符,使用'\$' 进行转义。在替换中,可以对编号组使用$g引用捕获组,对命名组使用${name}引用捕获组。
SELECT regexp_replace('1a 2b 14m','(\d+)([ab]) ','3c$2 ');-- '3ca 3cb 14m'
- regexp_replace(string, pattern, function) → varchar
描述:使用function替换与字符串中的正则表达式模式匹配的子字符串的每个实例。对于每个匹配,以数组形式传递的捕获组都会调用lambda表达式函数。捕获组号从1开始;整个匹配没有分组(如果需要,请用括号将整个表达式括起来)。
SELECT regexp_replace('new york','(\w)(\w*)',x->upper(x[1])||lower(x[2]));--'New York'
- regexp_split(string, pattern) -> array(varchar)
描述:使用正则表达式模式拆分字符串并返回一个数组。尾随的空字符串被保留。
SELECT regexp_split('1a 2b 14m','\s*[a-z]+\s*');-- [1, 2, 14, ]