REGEXP_EXTRACT

REGEXP_EXTRACT函数用于在字符串source中按照pattern进行字符串匹配,并返回第group_id个组匹配到的字符串内容。

注意事项

REGEXP_EXTRACT函数在Hive兼容数据类型版本中遵循Java regex规范。而在1.02.0数据类型版本中,则遵循MaxCompute的规范。

命令格式

STRING REGEXP_EXTRACT(STRING <source>, STRING <pattern>[, BIGINT <group_id>])

参数说明

  • source:必填。STRING类型,被匹配的字符串。

  • pattern:必填。STRING类型常量或正则表达式。用于匹配的子字符串或正则表达式。更多正则表达式编写规范,请参见正则表达式规范

  • group_id:可选。BIGINT类型。取值大于等于0。

    • 如果不指定group_id,默认为1,返回匹配的第一个组。

    • 如果指定group_id,返回第group_id个组匹配到的字符串内容。

    • 如果group_id等于0,则返回满足整个pattern的子串。

说明

数据以UTF-8格式保存。对于中文字符可以用对应的16进制编码表示,中文字符编码的范围是[\\x{4e00},\\x{9fa5}]

返回值说明

返回STRING类型。返回规则如下:

  • 如果pattern为空串或pattern中没有分组且未指定group_id,返回报错。

    说明

    执行SET odps.sql.bigquery.compatible=true;开启BigQuery兼容模式,如果pattern中没有分组且未指定group_id时,则返回满足整个pattern的子串。

  • group_idBIGINT类型或小于0时,返回报错。

  • sourcepatterngroup_id值为NULL时,返回NULL。

使用示例

  • 示例1:将foothebar按照foo(.*?)(bar)拆分。命令示例如下:

    -- 未指定groupid,返回the。
    SELECT REGEXP_EXTRACT('foothebar', 'foo(.*?)(bar)');
    -- 指定groupid,返回foothebar。
    SELECT REGEXP_EXTRACT('foothebar', 'foo(.*?)(bar)', 0);
  • 示例2:将8d99d8按照8d(\\d+)d8拆分。命令示例如下:

    -- 返回99。在MaxCompute客户端上提交正则计算的SQL,需要使用两个"\"作为转义字符。
    SELECT REGEXP_EXTRACT('8d99d8', '8d(\\d+)d8');
  • 示例3:提取【阿里云】aliyun中的中文字符及标点。命令示例如下:

    -- 返回【阿里云】。
    SELECT REGEXP_EXTRACT('【阿里云】aliyun', '([^\\x{00}-\\x{ff}]+)');
  • 示例4:提取【阿里云】aliyun中的中文字符。命令示例如下:

    -- 返回阿里云。
    SELECT REGEXP_EXTRACT('【阿里云】aliyun', '([\\x{4e00}-\\x{9fa5}]+)');
  • 示例5:提取【阿里云】aliyun阿里云中的中文字符,该场景无法通过REGEXP_EXTRACT函数实现,改为使用REGEXP_REPLACE函数。命令示例如下:

    -- 返回【阿里云】阿里云。
    SELECT REGEXP_REPLACE('【阿里云】aliyun阿里云','([\\x{00}-\\x{ff}])', '');
  • 示例6:pattern中没有分组。命令示例如下:

    • 场景一:pattern中没有分组且未指定group_id,则返回报错。在BigQuery兼容模式下,则返回满足整个pattern的子串。

      -- 返回报错。FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: SQL Runtime Unretryable Error: ODPS-0121065:Argument value out of range - Regex group count is 0, but the specified group index is 1
      SELECT REGEXP_EXTRACT('foothebar', 'thebar');
      
      -- 打开BigQuery兼容模式。
      SET odps.sql.bigquery.compatible=true;
      -- 返回thebar。
      SELECT REGEXP_EXTRACT('foothebar', 'thebar');
    • 场景二:pattern中没有分组且指定group_id0,则返回满足整个pattern的子串。

      -- 返回 thebar。
      SELECT REGEXP_EXTRACT('foothebar', 'thebar',0);

相关函数

REGEXP_EXTRACT函数属于字符串函数,更多查找字符串、转换字符串格式的相关函数请参见字符串函数