如何使用正则表达式移除MySQL列中括号包裹的文本(含括号)
MySQL去除括号内容及残留空格解决方案
针对MySQL 8.0+版本(推荐)
直接使用REGEXP_REPLACE结合TRIM函数即可完成需求,一步到位处理括号内容和残留空格:
SELECT TRIM(REGEXP_REPLACE(REGEXP_REPLACE(your_column, '\\([^)]*\\)', ''), '\\s+', ' ')) AS cleaned_text FROM your_table;
逻辑拆解:
- 删除括号及内部内容:
REGEXP_REPLACE(your_column, '\\([^)]*\\)', '')\\(和\\)是转义后的左右括号(正则中括号属于特殊字符,必须转义)[^)]*匹配任意非右括号的字符,确保仅匹配到当前括号对的内容,不会跨括号匹配
- 合并连续空格:
REGEXP_REPLACE(..., '\\s+', ' ')- 将处理后产生的多个连续空白字符(空格、换行、制表符等)替换为单个空格
- 去除首尾空格:
TRIM(...)- 清理文本开头和结尾的多余空格,保证结果整洁
测试验证:
| 原始数据 | 处理后结果 |
|---|---|
foo (bar) | foo |
foo (bar 5) (foo) | foo |
foo (bar) bar (foobar) foo | foo bar foo |
针对MySQL 5.x版本(无REGEXP_REPLACE支持)
如果无法升级版本,可以自定义函数实现相同逻辑:
DELIMITER // CREATE FUNCTION clean_text(input_text TEXT) RETURNS TEXT DETERMINISTIC BEGIN DECLARE temp_text TEXT; DECLARE open_pos INT; DECLARE close_pos INT; SET temp_text = input_text; -- 循环删除所有括号对及内容 WHILE LOCATE('(', temp_text) > 0 AND LOCATE(')', temp_text) > LOCATE('(', temp_text) DO SET open_pos = LOCATE('(', temp_text); SET close_pos = LOCATE(')', temp_text); SET temp_text = CONCAT(SUBSTRING(temp_text, 1, open_pos - 1), SUBSTRING(temp_text, close_pos + 1)); END WHILE; -- 循环合并连续空格 WHILE LOCATE(' ', temp_text) > 0 DO SET temp_text = REPLACE(temp_text, ' ', ' '); END WHILE; -- 去除首尾空格 SET temp_text = TRIM(temp_text); RETURN temp_text; END // DELIMITER ;
调用方式:
SELECT clean_text(your_column) AS cleaned_text FROM your_table;
内容的提问来源于stack exchange,提问作者Gino
相关产品推荐
相关产品推荐

