跳到主要内容

SPLIT_BY_REGEXP

描述

SPLIT_BY_REGEXP 函数用于根据指定的正则表达式模式将字符串拆分成字符串数组。与 SPLIT_BY_STRING 不同,该函数支持复杂的正则表达式匹配,可以处理更灵活的分割规则。支持可选的最大分割数量限制,在处理结构化文本、数据清洗和模式匹配中非常有用。

语法

SPLIT_BY_REGEXP(<str>, <pattern> [, <max_limit>])

参数

参数说明
<str>需要分割的源字符串。类型:VARCHAR
<pattern>正则表达式模式,用作分割符。类型:VARCHAR
<max_limit>可选参数,限制返回数组的最大元素个数。类型:INT

返回值

返回 ARRAY 类型,表示按正则表达式拆分后的字符串数组。

分割规则:

  • 使用正则表达式模式匹配分割点
  • 支持标准的正则表达式语法
  • 空字符串模式会将字符串拆分成单个字符
  • 如果模式不匹配任何内容,返回包含原字符串的单元素数组
  • max_limit 限制结果数组的最大长度

特殊情况:

  • 如果任一参数为 NULL,返回 NULL
  • 如果字符串为空,返回包含空字符串的单元素数组
  • 如果正则表达式为空字符串,按字符拆分
  • 如果 max_limit 为 0 或负数,不进行限制
  • 连续的匹配会产生空字符串元素

示例

  1. 空模式按字符分割
SELECT SPLIT_BY_REGEXP('abcde', '');
+------------------------------+
| SPLIT_BY_REGEXP('abcde', '') |
+------------------------------+
| ["a", "b", "c", "d", "e"] |
+------------------------------+
  1. 数字模式分割
SELECT SPLIT_BY_REGEXP('a12bc23de345f', '\\d+');
+-----------------------------------------+
| SPLIT_BY_REGEXP('a12bc23de345f', '\d+') |
+-----------------------------------------+
| ["a", "bc", "de", "f"] |
+-----------------------------------------+
  1. NULL 值处理
SELECT SPLIT_BY_REGEXP(NULL, '\\d+'), SPLIT_BY_REGEXP('test', NULL);
+--------------------------------+--------------------------------+
| SPLIT_BY_REGEXP(NULL, '\d+') | SPLIT_BY_REGEXP('test', NULL) |
+--------------------------------+--------------------------------+
| NULL | NULL |
+--------------------------------+--------------------------------+
  1. 空字符串处理
SELECT SPLIT_BY_REGEXP('', ','), SPLIT_BY_REGEXP('hello', 'xyz');
+---------------------------+-------------------------------+
| SPLIT_BY_REGEXP('', ',') | SPLIT_BY_REGEXP('hello', 'xyz') |
+---------------------------+-------------------------------+
| [""] | ["hello"] |
+---------------------------+-------------------------------+
  1. 使用最大限制参数
SELECT SPLIT_BY_REGEXP('a,b,c,d,e', ',', 3), SPLIT_BY_REGEXP('1-2-3-4-5', '-', 2);
+--------------------------------------+--------------------------------------+
| SPLIT_BY_REGEXP('a,b,c,d,e', ',', 3) | SPLIT_BY_REGEXP('1-2-3-4-5', '-', 2) |
+--------------------------------------+--------------------------------------+
| ["a", "b", "c,d,e"] | ["1", "2-3-4-5"] |
+--------------------------------------+--------------------------------------+
  1. 空白字符模式
SELECT SPLIT_BY_REGEXP('hello world  test', '\\s+'), SPLIT_BY_REGEXP('a\tb\nc\rd', '\\s');
+------------------------------------------+------------------------------------+
| SPLIT_BY_REGEXP('hello world test', '\s+') | SPLIT_BY_REGEXP('a\tb\nc\rd', '\s') |
+------------------------------------------+------------------------------------+
| ["hello", "world", "test"] | ["a", "b", "c", "d"] |
+------------------------------------------+------------------------------------+
  1. 特殊字符和转义
SELECT SPLIT_BY_REGEXP('a.b.c.d', '\\.'), SPLIT_BY_REGEXP('x(y)z[w]', '[\\(\\)\\[\\]]');
+----------------------------------+--------------------------------------------+
| SPLIT_BY_REGEXP('a.b.c.d', '\.') | SPLIT_BY_REGEXP('x(y)z[w]', '[\(\)\[\]]') |
+----------------------------------+--------------------------------------------+
| ["a", "b", "c", "d"] | ["x", "y", "z", "w"] |
+----------------------------------+--------------------------------------------+
  1. 单词边界和复杂模式
SELECT SPLIT_BY_REGEXP('TheQuickBrownFox', '[A-Z]'), SPLIT_BY_REGEXP('user@example.com', '@|\\.');
+------------------------------------------+-------------------------------------------+
| SPLIT_BY_REGEXP('TheQuickBrownFox', '[A-Z]') | SPLIT_BY_REGEXP('user@example.com', '@|\.') |
+------------------------------------------+-------------------------------------------+
| ["", "he", "uick", "rown", "ox"] | ["user", "example", "com"] |
+------------------------------------------+-------------------------------------------+
  1. UTF-8 多字节字符
SELECT SPLIT_BY_REGEXP('ṭṛì→ḍḍumai→hello', '→'), SPLIT_BY_REGEXP('αβγδε', '[βδ]');
+------------------------------------------+----------------------------------+
| SPLIT_BY_REGEXP('ṭṛì→ḍḍumai→hello', '→') | SPLIT_BY_REGEXP('αβγδε', '[βδ]') |
+------------------------------------------+----------------------------------+
| ["ṭṛì", "ḍḍumai", "hello"] | ["α", "γ", "ε"] |
+------------------------------------------+----------------------------------+
  1. 连续匹配和空元素
SELECT SPLIT_BY_REGEXP('a,,b,c', ','), SPLIT_BY_REGEXP('123abc456def', '[a-z]+');
+-------------------------------+---------------------------------------+
| SPLIT_BY_REGEXP('a,,b,c', ',') | SPLIT_BY_REGEXP('123abc456def', '[a-z]+') |
+-------------------------------+---------------------------------------+
| ["a", "", "b", "c"] | ["123", "456", ""] |
+-------------------------------+---------------------------------------+