Mysql 简明教程

MySQL - REGEXP_REPLACE() Function

MySQL 中的正则表达式用于搜索操作,不仅可以过滤记录,还可以替换字符串中的模式出现。

考虑这样一个场景:你注意到 MySQL 数据库中存在大量数据集中拼写错误。现在,你应该在此数据库中更正这些错误的所有出现,而不影响其他数据。正则表达式在这里非常有利。

你可以使用正则表达式来查找相同错误的准确出现并用正确的字符替换它。这是使用 regexp_replace() 函数完成的。

MySQL REGEXP_REPLACE() Function

MySQL regexp_replace() 函数用于查找和替换与特定模式匹配的字符串的出现。如果匹配,它将用另一个字符串替换该字符串。如果没有匹配,它将返回原始字符串。如果字符串或模式为 NULL,它将返回 NULL。你可以在此函数中使用正则表达式或简单的字符串作为模式。

Syntax

以下是 MySQL regexp_replace() 函数的语法:

REGEXP_REPLACE(expr, pattern, repl[, pos[, occurrence[, match_type]]])

Parameters

regexp_replace() 函数采用以下参数值:

  1. expr: 在其中执行搜索的字符串

  2. pattern: 在字符串中搜索的模式

  3. repl: The replacement string

此方法还接受以下可选参数:

  1. pos − 搜索开始位置

  2. occurrence − 替换匹配到的第几个匹配项。若省略该参数,则默认值为 0,替换所有匹配项。

  3. match_type − 指定如何执行匹配操作的字符串。

Example

我们使用 MySQL REGEXP_REPLACE() 函数对一个简单字符串执行了搜索操作,如下所示:

SELECT REGEXP_REPLACE('Welcome To Tutorialspoint!', 'Welcome', 'Welll')
AS RESULT;

从以下输出中我们可以观察到,字符串“Welcome”已被找到并替换为“Welll”:

但如果字符串中没有找到模式,则函数会显示原始字符串。请看以下查询:

SELECT REGEXP_REPLACE('Welcome To Tutorialspoint!', 'H', 'Hi') AS RESULT;

执行给定的查询后,输出如下:

Example

我们还尝试将可选参数作为不区分大小写的匹配(i)传递给该函数。在此,搜索从给定字符串的第 10 个位置开始;由于我们将匹配项值设为 1,因此在第 10 个位置之后,仅第一个字母“t”的匹配项将被替换,无论其大小写如何:

SELECT REGEXP_REPLACE('Welcome To Tutorialspoint!', 't', 'x', 10, 1, 'i') AS RESULT;

Output

以上程序的输出如下所示:

Example

以下查询替换给定文本中字符串“is”的所有匹配项:

SELECT REGEXP_REPLACE('This is a sample string', 'is', '@@@@')
As Result;

Output

执行给定的查询后,输出如下:

Example

以下查询仅将给定文本中字符串“This”的第一个匹配项替换为“That”:

SELECT REGEXP_REPLACE('This is a test and This is another test', '^This', 'That')
As Result;

Output

以上查询的输出如下所示:

Example

在此,以下查询使用 MySQL REGEXP_REPLACE() 函数,将给定字符串中的单词“wall”或“floor”替换为单词“bed”:

SELECT REGEXP_REPLACE ('Humpty dumpty sat on a wall and slept on the floor', 'wall|floor', 'bed') As Result;

Output

执行给定的程序后,输出如下所示:

Example

以下查询用字符串“drink”替换给定输入字符串中字符串“eat”的第一个匹配项。

在查询中,第四个参数“1”指定开始搜索的位置,第五个参数“1”是要进行的替换的次数。因此,只将“eat”的第一次匹配项替换为“drink”。

SELECT REGEXP_REPLACE('eat sleep repeat and eat', 'eat', 'drink', 1, 1)
As Result;

Output

输出如下:

Example

如果传递给该函数的头两个参数中的任何一个为 NULL,该函数将返回 NULL。在此,我们用 NULL 作为字符串参数。

SELECT REGEXP_REPLACE(NULL, 'value', 'test') As Result;

输出如下:

如果我们用 NULL 作为模式参数,则返回 NULL 作为输出。

SELECT REGEXP_REPLACE('Welcome to Tutorialspoint', NULL, 'sample')
As Result;

以上查询的输出如下所示:

如果您将空字符串作为替换字符串传递,则该函数将返回 NULL。

SELECT REGEXP_REPLACE('Welcome to Tutorialspoint', NULL, '')
As Result;

执行给定的查询后,输出如下:

Example

在另一个示例中,我们尝试使用 REGEXP_REPLACE() 函数对名为 CUSTOMERS 的数据库表执行搜索操作。首先,我们使用以下查询创建表 −

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下查询在上述创建的表中插入 7 条记录 −

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

执行以下 SELECT 语句以显示 CUSTOMERS 表的所有记录 −

Select * from CUSTOMERS;

以下为 CUSTOMERS 表 −

以下查询使用 REGEXP_REPLACE() 函数更新 person_tbl 表中的 NAME 列。它查找以字母“A”开头的名称,并用“An”替换该“A”。

SELECT REGEXP_REPLACE(NAME, '^A', 'An') AS Result FROM CUSTOMERS;

执行给定的查询后,输出如下:

但是,如果在表的任何记录中找不到该模式,函数将显示表的原始值。查看以下查询 −

SELECT REGEXP_REPLACE(ADDRESS, '^Z', 'P') AS RESULT FROM CUSTOMERS;

ADDRESS 列中没有以字母“Z”开头的记录。因此,它将原始记录作为输出返回 −

以下查询使用 REGEXP_REPLACE 函数将 CUSTOMERS 表的 ADDRESS 列中的第二个字母“r”替换为“R” −

SELECT REGEXP_REPLACE(ADDRESS, 'r', 'R', 2, 0, 'c')
AS RESULT FROM CUSTOMERS;

正如我们在输出中看到的,记录“Hyderabad”和“Indore”中都有字母“r”。而且它们被“R”替换 −

REGEXP_REPLACE() Funcion Using a Client Program

我们还可以使用客户端程序执行 MySQL REGEXP_REPLACE 函数来查找和替换与特定模式匹配的字符串的出现。

Syntax

以下是此操作在各种编程语言中的语法 −

Example

以下是这些程序 −