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

用于字符串替换的函数

通用字符串函数字符串搜索函数 将分别进行说明。

注意

下面的文档是从 system.functions 系统表生成的。

format

引入版本:v20.1

使用参数中给出的值(字符串、整数等)对 pattern 字符串进行格式化,类似于 Python 中的格式化方式。 pattern 字符串可以包含由花括号 {} 包围的替换字段。 不在花括号中的任何内容都被视为字面文本内容,并按原样复制到输出中。 字面量花括号字符可以通过两个花括号来转义:{{}}。 字段名称可以是数字(从 0 开始)或者为空(此时会隐式地按从 0 开始依次递增的编号进行标记)。

语法

format(pattern, s0[, s1, ...])

参数

  • pattern — 包含占位符的格式字符串。String
  • s0[, s1, ...] — 用于替换 pattern 中占位符的一个或多个值。Any

返回值

返回一个格式化的字符串。String

示例

编号占位符

SELECT format('{1} {0} {1}', 'World', 'Hello')
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello                       │
└─────────────────────────────────────────┘

隐式编号

SELECT format('{} {}', '你好', '世界')
┌─format('{} {}', 'Hello', 'World')─┐
│ 你好,世界                         │
└───────────────────────────────────┘

overlay

引入版本:v24.9

从以 1 为起点的索引 offset 开始,将字符串 input 的一部分替换为另一个字符串 replace

语法

overlay(s, replace, offset[, length])

参数

  • s — 输入字符串。String
  • replace — 用于替换的字符串。const String
  • offset — 整数类型 Int(从 1 开始计数)。如果 offset 为负数,则从字符串 s 的末尾开始计数。Int
  • length — 可选。整数类型 Intlength 指定在输入字符串 s 中要替换的片段长度。如果未指定 length,则从 s 中移除的字节数等于 replace 的长度;否则移除 length 个字节。Int

返回值

返回替换后的字符串。String

示例

基本替换

SELECT overlay('我的父亲来自墨西哥。', '母亲', 4) AS res;
┌─res──────────────────────┐
│ 我妈妈来自墨西哥。        │
└──────────────────────────┘

保留长度的替换

SELECT overlay('My dad is from Mexico.', 'dad', 4, 6) AS res;
┌─res───────────────────┐
│ 我爸爸来自墨西哥。│
└───────────────────────┘

overlayUTF8

自 v24.9 引入

从以 1 为起始的索引 offset 位置开始,将字符串 s 的一部分替换为另一个字符串 replace。 假定该字符串包含有效的 UTF-8 编码文本。 如果该假设不成立,则不会抛出异常,结果未定义。

语法

overlayUTF8(s, replace, offset[, length])

参数

  • s — 输入字符串。String
  • replace — 用于替换的字符串。const String
  • offset — 整数类型 Int(从 1 开始计数)。如果 offset 为负数,则从输入字符串 s 的末尾开始计数。(U)Int*
  • length — 可选。指定在输入字符串 s 中要被替换的片段长度。如果未指定 length,则从 s 中移除的字符数等于 replace 的长度,否则移除 length 个字符。(U)Int*

返回值

返回替换后的字符串。String

示例

UTF-8 替换

SELECT overlayUTF8('Mein Vater ist aus Österreich.', 'der Türkei', 20) AS res;
┌─res───────────────────────────┐
│ Mein Vater ist aus der Türkei.│
└───────────────────────────────┘

printf

引入版本:v24.8

printf 函数会使用参数中提供的值(字符串、整数、浮点数等)来格式化给定的字符串,类似于 C++ 中的 printf 函数。 格式字符串可以包含以 % 字符开头的格式说明符。 不属于 % 及其后续格式说明符的任何内容都被视为字面文本,并原样复制到输出中。 要输出字面意义上的 % 字符,可以使用 %% 进行转义。

语法

printf(format[, sub1, sub2, ...])

参数

  • format — 带有 % 说明符的格式字符串。String
  • sub1, sub2, ... — 可选。要替换到格式字符串中的零个或多个值。Any

返回值

返回一个格式化后的字符串。String

示例

C++ 风格的格式化

SELECT printf('%%%s %s %d', 'Hello', 'World', 2024);
┌─printf('%%%s %s %d', 'Hello', 'World', 2024)─┐
│ %Hello World 2024                            │
└──────────────────────────────────────────────┘

regexpQuoteMeta

自 v20.1 起引入

为在正则表达式中具有特殊含义的这些字符添加反斜杠:\0\\|()^$.[]?*+{:-。 该实现与 re2::RE2::QuoteMeta 略有不同。 它将空字节转义为 \0 而不是 \x00,并且只转义必要的字符。

语法

regexpQuoteMeta(s)

参数

  • s — 输入字符串,其中包含需要在正则表达式中转义的字符。String

返回值

返回一个字符串,其中的正则表达式特殊字符已被转义。String

示例

对正则表达式的特殊字符进行转义

SELECT regexpQuoteMeta('Hello. [World]? (Yes)*') AS res
┌─res───────────────────────────┐
│ Hello\. \[World\]\? \(Yes\)\* │
└───────────────────────────────┘

replaceAll

自 v1.1 版本引入

haystack 中所有出现的子字符串 pattern 替换为字符串 replacement

语法

replaceAll(haystack, pattern, replacement)

别名: replace

参数

  • haystack — 输入的待搜索字符串。String
  • pattern — 要查找并替换的子字符串(模式)。const String
  • replacement — 用于替换该子字符串(模式)的字符串。const String

返回值

返回一个字符串,其中所有出现的模式都会被替换。String

示例

替换所有出现的模式

SELECT replaceAll('Hello, Hello world', 'Hello', 'Hi') AS res;
┌─res──────────┐
│ 你好,你好世界 │
└──────────────┘

replaceOne

在 v1.1 中引入

haystack 中第一次出现的子字符串 pattern 替换为字符串 replacement

语法

replaceOne(haystack, pattern, replacement)

参数

  • haystack — 要在其中进行搜索的输入字符串。String
  • pattern — 要查找并替换的子字符串。const String
  • replacement — 用于替换该子字符串的字符串。const String

返回值

返回一个字符串,其中第一个匹配到的子字符串已被替换。String

示例

替换首次出现的子字符串

SELECT replaceOne('Hello, Hello world', 'Hello', 'Hi') AS res;
┌─res─────────────┐
│ 嗨,世界,你好 │
└─────────────────┘

replaceRegexpAll

自 v1.1 引入

replaceRegexpOne 类似,但会替换模式的所有匹配项。 作为例外,如果正则表达式在空子串上匹配,则替换最多只执行一次。

语法

replaceRegexpAll(haystack, pattern, replacement)

别名: REGEXP_REPLACE

参数

  • haystack — 要在其中搜索的输入字符串。String
  • pattern — 要查找的正则表达式模式。const String
  • replacement — 用于替换匹配模式的字符串,可以包含替换占位符。const String

返回值

返回一个字符串,其中所有正则匹配项都已被替换。String

示例

将所有字符替换为双写形式

SELECT replaceRegexpAll('Hello123', '.', '\\\\0\\\\0') AS res
┌─res──────────────────┐
│ HHeelllloo112233     │
└──────────────────────┘

空字符串替换示例

SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
┌─res─────────────────┐
│ here: Hello, World! │
└─────────────────────┘

replaceRegexpOne

引入版本:v1.1

haystack 中第一个与正则表达式 pattern(re2 语法)匹配的子串替换为字符串 replacementreplacement 可以包含替换序列 \0-\9。 替换序列 \1-\9 对应第 1 到第 9 个捕获组(子匹配),替换序列 \0 对应整个匹配结果。 如果要在 patternreplacement 字符串中使用字面量 \ 字符,需要将其写作 \\ 进行转义。 同时请注意,字符串字面量本身还需要额外的转义。

语法

replaceRegexpOne(haystack, pattern, replacement)

参数

  • haystack — 要在其中进行搜索的输入字符串。String
  • pattern — 要匹配的正则表达式模式。const String
  • replacement — 用于替换匹配结果的字符串,可包含替换引用。const String

返回值

返回一个字符串,其中第一个正则表达式匹配项已被替换。String

示例

将 ISO 日期转换为美国日期格式

SELECT DISTINCT
    EventDate,
    replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res
FROM test.hits
LIMIT 7
FORMAT TabSeparated
2014-03-17      03/17/2014
2014-03-18      03/18/2014
2014-03-19      03/19/2014
2014-03-20      03/20/2014
2014-03-21      03/21/2014
2014-03-22      03/22/2014
2014-03-23      03/23/2014

将字符串复制 10 次

SELECT replaceRegexpOne('Hello, World!', '.*', '\\\\0\\\\0\\\\0\\\\0\\\\0\\\\0\\\\0\\\\0\\\\0\\\\0') AS res
┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!你好,世界! │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

translate

引入于:v22.7

使用由字符串 fromto 定义的一对一字符映射,替换字符串 s 中的字符。 fromto 必须是常量 ASCII 字符串。 如果 fromto 的长度相同,则 s 中每个出现的 from 的第一个字符都会被替换为 to 的第一个字符,from 的第二个字符在 s 中的每次出现都会被替换为 to 的第二个字符,依此类推。 如果 from 中包含的字符多于 to,那么 from 末尾中在 to 中没有对应字符的所有字符在 s 中的所有出现都会被删除。 函数不会修改 s 中的非 ASCII 字符。

语法

translate(s, from, to)

参数

  • s — 要进行转换的输入字符串。String
  • from — 包含要替换字符的常量 ASCII 字符串。const String
  • to — 包含替换后字符的常量 ASCII 字符串。const String

返回值

返回应用了字符替换后的字符串。String

示例

字符映射

SELECT translate('Hello, World!', 'delor', 'DELOR') AS res
┌─res───────────┐
│ HELLO, WORLD! │
└───────────────┘

不同长度

SELECT translate('clickhouse', 'clickhouse', 'CLICK') AS res
┌─res───┐
│ 点击 │
└───────┘

translateUTF8

自 v22.7 起提供

translate 类似,但假定 sfromto 是 UTF-8 编码的字符串。

语法

translateUTF8(s, from, to)

参数

  • s — 要进行字符替换的 UTF-8 输入字符串。String
  • from — 包含要被替换字符的常量 UTF-8 字符串。const String
  • to — 包含替换后字符的常量 UTF-8 字符串。const String

返回值

返回一个 String 数据类型的值。String

示例

UTF-8 字符替换

SELECT translateUTF8('Münchener Straße', 'üß', 'us') AS res;
┌─res──────────────┐
│ Munchener Strase │
└──────────────────┘