REGEXP_EXTRACT_ALL

REGEXP_EXTRACT_ALL函数用于在字符串source中查找所有与pattern匹配的子字符串,并以数组形式返回所有找到的字符串。

命令格式

ARRAY<T> REGEXP_EXTRACT_ALL(STRING <source>, STRING <pattern>[,BIGINT <group_id>])

参数说明

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

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

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

    • 如果不指定group_id, 默认为1,返回group_id1的所有匹配结果组成的数组。

    • 如果指定group_id,返回该group_id匹配的所有结果组成的数组。

    • 如果group_id等于0,pattern将被当作一个整体进行匹配。

返回值说明

返回ARRAY<STRING>类型。返回规则如下:

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

    说明

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

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

  • sourcepatterngroup_id值为NULL时,返回NULL。

使用示例

  • 示例一:不指定group_id时,默认返回第一个group_id匹配到的结果。

    -- 返回 ["100","300"]。
    SELECT REGEXP_EXTRACT_ALL('100-200, 300-400', '(\\d+)-(\\d+)');
  • 示例二:指定group_id值为2,返回第二个group_id匹配到的结果。

    -- 返回["200","400"] 。
    SELECT REGEXP_EXTRACT_ALL('100-200, 300-400', '(\\d+)-(\\d+)',2);
  • 示例三: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_ALL('100-200, 300-200', '\\d+-\\d+'); 
      
      -- 开启BigQuery兼容模式。
      SET odps.sql.bigquery.compatible=true;
      -- 返回["100-200","300-200"]。
      SELECT REGEXP_EXTRACT_ALL('100-200, 300-200', '\\d+-\\d+'); 
    • 场景二:pattern中没有分组且指定group_id值为0,则返回满足整个pattern的子串组成的数组。

      -- 返回["100-200","300-200"]。
      SELECT REGEXP_EXTRACT_ALL('100-200, 300-200', '\\d+-\\d+',0);

相关函数

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