跳转到主内容
跳转到主内容

用于分割字符串的函数

注意

下面的文档是从 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-grams。

语法

ngrams(s, N)

参数

返回值

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

示例

用法示例

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

reverseBySeparator

引入版本:v26.2

反转由指定分隔符分隔的字符串中的子串顺序。 该函数按分隔符拆分字符串,反转得到的各个部分的顺序, 然后使用相同的分隔符将其重新连接。对于解析域名、 文件路径或其他需要反转组件顺序的分层数据非常有用。

示例:

  • reverseBySeparator('www.google.com') 返回 'com.google.www'
  • reverseBySeparator('a/b/c', '/') 返回 'c/b/a'
  • reverseBySeparator('x::y::z', '::') 返回 'z::y::x'

语法

reverseBySeparator(string[, separator])

参数

  • string — 要对其分区片段顺序进行反转的输入字符串。String
  • separator — 用于识别分区片段的分隔字符串。如果未提供,则使用 '.'(点)。默认值:'.' String

返回值

返回一个字符串,其子串按原始字符串从右到左的顺序排列,并使用相同的分隔符连接。String

示例

基本域名反转

SELECT reverseBySeparator('www.google.com')
'com.google.www'

路径反转

SELECT reverseBySeparator('a/b/c', '/')
'c/b/a'

自定义分隔符

SELECT reverseBySeparator('x::y::z', '::')
'z::y::x'

包含点号的边界情况

SELECT reverseBySeparator('.a.b.', '.')
'.b.a.'

单个元素

SELECT reverseBySeparator('single')
'single'

空分隔符

SELECT reverseBySeparator('abcde', '')
'edcba'

splitByChar

引入于:v1.1

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

注意

SETTINGS 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 为空而分隔符不为空
注意

splitby_max_substrings_includes_remaining_string(默认值:0)控制当参数 max_substrings > 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:

  • splitByNonAlpha 使用非字母数字的 ASCII 字符来拆分字符串(另见函数 splitByNonAlpha)。
  • splitByString(S) 使用用户定义的分隔字符串 S 来拆分字符串(另见函数 splitByString)。可以通过可选参数指定分隔符列表,例如:tokenizer = splitByString([', ', '; ', '\n', '\\'])。注意,每个分隔字符串可以由多个字符组成(如示例中的 ', ')。如果未显式指定(例如 tokenizer = splitByString),默认的分隔符列表是单个空格字符 [' ']
  • ngrams(N) 将字符串拆分为长度相同的 N-gram(另见函数 ngrams)。ngram 的长度可以通过 1 到 8 之间的可选整数参数指定,例如:tokenizer = ngrams(3)。如果未显式指定(例如 tokenizer = ngrams),默认的 ngram 长度为 3。
  • sparseGrams(min_length, max_length, min_cutoff_length) 将字符串拆分为长度在 min_lengthmax_length(含)之间的可变长度 n-gram(另见函数 sparseGrams)。如果未显式指定,min_lengthmax_length 的默认值分别为 3 和 100。如果提供参数 min_cutoff_length,则只返回长度大于或等于 min_cutoff_length 的 n-gram。与 ngrams(N) 相比,sparseGrams tokenizer 生成可变长度的 N-gram,从而可以更灵活地表示原始文本。例如,tokenizer = sparseGrams(3, 5, 4) 会在内部从输入字符串生成 3、4、5-gram,但只返回 4 和 5-gram。
  • array 不进行任何 tokenization,即每行的值本身就是一个 token(另见函数 array)。

对于 splitByString tokenizer,如果这些 token 并不构成一个 前缀码,通常希望在匹配时优先选择更长的分隔符。 要做到这一点,请按照分隔符长度的降序传入它们。 例如,在 separators = ['%21', '%'] 时,字符串 %21abc 会被拆分为 ['abc'];而在 separators = ['%', '%21'] 时,则会被拆分为 ['21ac'](这很可能不是预期结果)。

语法

tokens(value) -- 'splitByNonAlpha' tokenizer
tokens(value, 'splitByNonAlpha')
tokens(value, 'splitByString'[, separators])
tokens(value, 'ngrams'[, n])
tokens(value, 'sparseGrams'[, min_length, max_length[, min_cutoff_length]])
tokens(value, 'array')

参数

  • value — 输入字符串。StringFixedString
  • tokenizer — 要使用的 tokenizer(分词器)。可用参数为 splitByNonAlphangramssplitByStringarraysparseGrams。可选,如未显式设置,默认为 splitByNonAlphaconst String
  • n — 仅当参数 tokenizerngrams 时相关:可选参数,用于定义 n-gram 的长度。如未显式设置,默认为 3const UInt8
  • separators — 仅当参数 tokenizersplit 时相关:可选参数,用于定义分隔符字符串。如未显式设置,默认为 [' ']const Array(String)
  • min_length — 仅当参数 tokenizersparseGrams 时相关:可选参数,用于定义最小 gram 长度,默认为 3。const UInt8
  • max_length — 仅当参数 tokenizersparseGrams 时相关:可选参数,用于定义最大 gram 长度,默认为 100。const UInt8
  • min_cutoff_length — 仅当参数 tokenizersparseGrams 时相关:可选参数,用于定义最小截断长度。const UInt8

返回值

返回由输入字符串生成的 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']