Presto使用Java Pattern的正则表达式语法。但也有几个例外,如下所示:

  • 多行模式

    • 使用?m开启多行模式
    • 行终止符为\n
    • 不支持?d选项
  • 大小写敏感模式

    • 使用?i开启
    • 不支持?u选项
    • 不支持上下文敏感匹配
    • 不支持局部敏感匹配
  • 不支持 Surrogate pairs

    • 如 Unicode U+10000必须使用\x{10000}来表示,而不能用\uD800\uDC00来表示
  • 如果模式字符串中不包含基本字符,并且没有间隔,那么,使用边界字符\b会出错

  • 不支持在字符类(如[A-Z123])中使用\Q\E

  • 在Unicode字符类(\p{prop})的支持上存在如下不同:

    • 不支持下划线,如使用OldItalic代替Old_Italic
    • 不支持使用Is,script=,sc=来指定脚本,取而代之的是直接使用脚本名。如\p{Hiragana},而不是\p{script=Hiragana}
    • 不支持使用block=,blk=来表示区块,只能使用In。如\p{InMongolia}
    • 不支持使用Is, general_category=, gc=来指定分类,直接使用类别名称。如\p{L}
    • 直接使用二进制属性,如使用\p{NoncharacterCodePoint}而不是\p{IsNoncharacterCodePoint}

下面介绍 Presto 提供的正则表达式函数:

  • regexp_extract_all(string, pattern, [group]) → array<varchar>

    提取字符串string中所有与模式pattern匹配的子串。pattern中如果使用了分组的功能,则可以通过设置group参数,用于说明匹配哪个捕获组

    示例

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

    功能和用法与regexp_extract_all类似,只是本函数只提取第一个匹配的结果。

    示例

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

    判断字符串string中是否包含符合pattern模式的子串,包含返回TRUE,否则返回FALSE。本函数的功能与 SQL 中的LIKE语句功能相似,不同的是LIKE需要匹配整个模式字串,而本函数只需要字串中包含与模式字串相匹配子串即返回TRUE

    示例

    SELECT regexp_like('1a 2b 14m', '\d+b'); -- true
    
  • regexp_replace(string, pattern, [replacement]) → varchar

    replacement替换字符串string中所有符合模式pattern的子串。replacement可选,不设置将使用空字符''替换(即删除匹配的子串)。

    可以通过在replacement字串中使用$g(g为捕获组的序号,从1开始)或${组名称}来设置捕获组。美元符号$replacement字串中需要使用\$进行转义。

    示例

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

    使用模式字串pattern拆分字符串,保留尾部的空字符串。

    示例

    SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- ['1', '2', '14', ''] 4个元素
                                                      -- 最后一个为空字符