跳到主要内容
跳到主要内容

字符串分割函数

注意

以下文档根据 system.functions 系统表自动生成。

alphaTokens

引入版本:v1.1

a-zA-Z 范围内选取由连续字节组成的子字符串,并返回这些子字符串构成的数组。

语法

alphaTokens(s[, max_substrings])

别名: splitByAlpha

参数

  • s — 要拆分的字符串。String
  • max_substrings — 可选。当 max_substrings > 0 时,返回的子字符串数量不超过 max_substrings,否则函数将返回尽可能多的子字符串。Int64

返回值

返回由 s 中选定子字符串组成的数组。Array(String)

示例

用法示例

SELECT alphaTokens('abca1abc');
┌─alphaTokens('abca1abc')─┐
│ ['abca','abc']          │
└─────────────────────────┘

arrayStringConcat

自 v1.1 引入

使用提供的分隔符连接数组中各个值的字符串表示形式。分隔符是一个可选参数,默认值为空字符串。

语法

arrayStringConcat(arr[, separator])

参数

  • arr — 要拼接的数组。Array(T)
  • separator — 可选。分隔符字符串。默认值为空字符串。const String

返回值

返回拼接后的字符串。String

示例

用法示例

SELECT arrayStringConcat(['12/05/2021', '12:50:00'], ' ') AS DateString;
┌─DateString──────────┐
│ 12/05/2021 12:50:00 │
└─────────────────────┘

extractAllGroupsVertical

引入于:v20.5

使用正则表达式匹配字符串中的所有分组,并返回一个数组的数组,其中每个内部数组包含来自每个分组的匹配片段,这些片段按照它们在输入字符串中的出现顺序进行组织。

语法

extractAllGroupsVertical(s, regexp)

别名: extractAllGroups

参数

返回值

返回一个数组的数组,其中每个内部数组包含一次匹配中捕获的分组内容。每次匹配都会生成一个数组,其元素对应于正则表达式中的各个捕获组(第 1 组、第 2 组等)。如果未找到匹配,则返回空数组。Array(Array(String))

示例

用法示例

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroupsVertical(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','nginx'],['Date','Tue, 22 Jan 2019 00:26:14 GMT'],['Content-Type','text/html; charset=UTF-8'],['Connection','keep-alive']]

ngrams

自 v21.11 起引入

将 UTF-8 字符串拆分为长度为 N 的 n-gram。

语法

ngrams(s, N)

参数

返回值

返回一个由 n-gram 组成的数组。Array(String)

示例

使用示例

SELECT ngrams('ClickHouse', 3);
['Cli','lic','ick','ckH','kHo','Hou','ous','use']

splitByChar

引入版本:v1.1

将以指定的、长度恰为一个字符的常量字符串 separator 作为分隔符的字符串拆分为子字符串数组。 如果分隔符出现在字符串的开头或结尾,或者存在多个连续分隔符,则可能产生空子字符串。

注意

SETTING splitby_max_substrings_includes_remaining_string(默认值:0)用于控制当参数 max_substrings > 0 时,结果数组的最后一个元素中是否包含剩余字符串。

在以下情况下可能会选取空子字符串:

  • 分隔符出现在字符串的开头或结尾
  • 存在多个连续分隔符
  • 原始字符串 s 为空

语法

splitByChar(separator, s[, max_substrings])

参数

  • separator — 分隔符,必须是单字节字符。String
  • s — 要分割的字符串。String
  • max_substrings — 可选。若 max_substrings > 0,返回的数组最多包含 max_substrings 个子字符串,否则函数将返回尽可能多的子字符串。默认值为 0Int64

返回值

返回包含所选子字符串的数组。Array(String)

示例

使用示例

SELECT splitByChar(',', '1,2,3,abcde');
┌─splitByChar(⋯2,3,abcde')─┐
│ ['1','2','3','abcde']    │
└──────────────────────────┘

splitByNonAlpha

引入于:v21.9

将由空白和标点字符分隔的字符串拆分为子字符串数组。

注意

splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings > 0 时,结果数组的最后一个元素中是否包含剩余字符串。

语法

splitByNonAlpha(s[, max_substrings])

参数

  • s — 要拆分的字符串。String
  • max_substrings — 可选。当 max_substrings > 0 时,返回的子串数量最多为 max_substrings;否则函数将返回尽可能多的子串。默认值:0Int64

返回值

返回 s 中选定子串的数组。Array(String)

示例

使用示例

SELECT splitByNonAlpha('[email protected]');
['user','domain','com']

splitByRegexp

引入于:v21.6

根据给定的正则表达式,将字符串拆分为子字符串数组。 如果给定的正则表达式为空,则会将字符串拆分为由单个字符组成的数组。 如果正则表达式没有任何匹配,字符串不会被拆分。

可能会选中空子字符串的情况包括:

  • 在字符串开头或结尾出现非空正则表达式匹配
  • 存在多个连续的非空正则表达式匹配
  • 原始字符串为空而正则表达式不为空。
注意

设置 splitby_max_substrings_includes_remaining_string(默认值:0)用于控制当参数 max_substrings > 0 时,结果数组的最后一个元素中是否包含剩余字符串。

语法

splitByRegexp(regexp, s[, max_substrings])

参数

  • regexp — 正则表达式常量。StringFixedString
  • s — 要拆分的字符串。String
  • max_substrings — 可选。当 max_substrings > 0 时,返回的子字符串数量不超过 max_substrings,否则函数会返回尽可能多的子字符串。默认值:0Int64

返回值

返回 s 中选定子字符串的数组。Array(String)

示例

用法示例

SELECT splitByRegexp('\\d+', 'a12bc23de345f');
┌─splitByRegex⋯c23de345f')─┐
│ ['a12bc23de345f']        │
└──────────────────────────┘

空正则表达式

SELECT splitByRegexp('', 'abcde');
┌─splitByRegexp('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByString

引入版本:v1.1

使用由多个字符组成的常量分隔符 separator 将字符串拆分为子字符串数组。 如果分隔符字符串 separator 为空,则会将字符串 s 拆分为由单个字符组成的数组。

在以下情况下可能会产生空子字符串:

  • 非空分隔符出现在字符串的开头或结尾
  • 存在多个连续的非空分隔符
  • 原始字符串 s 为空,而分隔符不为空
注意

当参数 max_substrings > 0 时,splitby_max_substrings_includes_remaining_string(默认值:0)用于控制结果数组的最后一个元素中是否包含剩余字符串。

语法

splitByString(separator, s[, max_substrings])

参数

  • separator — 分隔符。String
  • s — 要拆分的字符串。String
  • max_substrings — 可选。当 max_substrings > 0 时,返回的子串数量不超过 max_substrings,否则函数将返回尽可能多的子串。默认值:0Int64

返回值

返回由 s 中选取的子串组成的数组 Array(String)

示例

用法示例

SELECT splitByString(', ', '1, 2 3, 4,5, abcde');
┌─splitByStrin⋯4,5, abcde')─┐
│ ['1','2 3','4,5','abcde'] │
└───────────────────────────┘

空分隔符

SELECT splitByString('', 'abcde');
┌─splitByString('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByWhitespace

自 v21.9 起引入

将由空白字符分隔的字符串拆分为由子字符串组成的数组。

注意

设置 splitby_max_substrings_includes_remaining_string(默认值:0)用于控制当参数 max_substrings > 0 时,结果数组的最后一个元素中是否包含剩余的字符串。

语法

splitByWhitespace(s[, max_substrings])

参数

  • s — 要拆分的字符串。String
  • max_substrings — 可选参数。当 max_substrings > 0 时,返回的子串数量不超过 max_substrings,否则函数会返回尽可能多的子串。默认值:0Int64

返回值

返回由 s 中选取的子串构成的数组。Array(String)

示例

使用示例

SELECT splitByWhitespace('  1!  a,  b.  ');
['1!','a,','b.']

tokens

自 v21.11 起引入

使用指定的 tokenizer 将字符串拆分为若干 token。 默认的 tokenizer 会将非字母数字的 ASCII 字符视为分隔符。

在使用 split tokenizer 时,如果这些 token 并不构成一个 prefix code,通常会希望在匹配时优先使用更长的分隔符。 为此,请按分隔符长度从长到短的顺序传入分隔符。 例如,当 separators = ['%21', '%'] 时,字符串 %21abc 会被分词为 ['abc'];而当 separators = ['%', '%21'] 时,则会被分词为 ['21ac'](这很可能不是你想要的结果)。

语法

tokens(value[, tokenizer[, ngrams[, separators]]])

参数

  • value — 输入字符串。StringFixedString
  • tokenizer — 要使用的分词器(tokenizer)。可选值包括 splitByNonAlphangramssplitByStringarraysparseGrams。可选参数,如果未显式设置,则默认为 splitByNonAlphaconst String
  • ngrams — 仅当参数 tokenizerngrams 时生效:用于定义 n-grams 长度的可选参数。取值必须在 1 到 8 之间。如果未显式设置,则默认为 3const UInt8
  • separators — 仅当参数 tokenizersplit 时生效:用于定义分隔字符串的可选参数。如果未显式设置,则默认为 [' ']const Array(String)

返回值

返回由输入字符串拆分得到的 token 数组。Array

示例

默认分词器(tokenizer)

SELECT tokens('test1,;\\\\ test2,;\\\\ test3,;\\\\   test4') AS tokens;
['test1','test2','test3','test4']

N-gram 分词器

SELECT tokens('abc def', 'ngrams', 3) AS tokens;
['abc','bc ','c d',' de','def']