mysql-正则表达式的使用
使用环境: 8.0.12 MySQL+win10,不同环境可能会有些许差异。
- 匹配修饰符:
- ^:用来匹配字符串的开始
- $:用来匹配字符串的结尾。
- []:方括号中的任何字符都可以匹配,例如[0-9a-z其他]可以匹配‘0-9’数字任意一个,小写字母‘a-z’任意一个,‘其’,‘他’。
- -:连接符用来表示字符串的范围,如上面的[0-9]
- +:表示匹配次数出现一个或多个。
- *:表示匹配该字符出现0个或多个,比如[0-9]*表示匹配0个或多个数字。
- ():在圆括号中的内容将被看做一个整体。(ab)匹配ab。
- {m}:整数m表示花括号前的字符串出现的次数。比如(ab){2}匹配abab,(ab){1,3}表示匹配1到3个‘ab’。
- |:表示或‘or’,比如’^张|^李’表示匹配张开头,或者李开头。
- 方括号‘[]’中也可以船体标准类名,表示特定的匹配规则,使用格式:[:character_class:];详情如下:
select * from student where name regexp "[:lower:]"; -- 查找名字包含小写字母的学生信息
注意事项:
-
正则表达式由具有特定含义的特殊字符构成;如果要匹配这些特殊字符,就需要用\为前导;\-表示查找-,\.表示查找.,\\表示查找\;(转义特殊字符MySQL自己解释一个,正则表达式库解释一个);另外,mysql正则表达式默认是不区分大小写的,如果希望区分大小写,可以使用binary关键字。比如:
select * from student where name regexp binary "^张"; -- 查找名字是‘张’看头的学生信息 select * from student where name not regexp binary "^张"; -- 当然也可以使用not regexp
-
正则函数:
名称 | 描述 |
---|---|
NOT REGEXP | REGEXP的否定 |
REGEXP | string是否匹配正则表达式 |
REGEXP_INSTR() | 匹配正则表达式的子串的起始索引 |
REGEXP_LIKE() | string是否匹配正则表达式 |
REGEXP_REPLACE() | 替换匹配正则表达式的子字符串 |
REGEXP_SUBSTR() | 返回子串匹配正则表达式 |
RLIKE | string是否匹配正则表达式 |
- REGEXP
- 是否不匹配:expr NOT REGEXP pat, expr NOT RLIKE pat;这是一样的: NOT (expr REGEXP pat);
- 是否匹配:expr REGEXP pat, expr RLIKE pat;
- REGEXP并且 RLIKE是同义词REGEXP_LIKE()。
- 如果expr(字符串)匹配正则表达式(pat)则返回1,不匹配返回0.
select '是的' regexp '[:lower:]'; -- 不匹配,返回0。
- REGEXP_INSTR
- REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
- 返回与expr模式指定的正则表达式匹配 的字符串子字符串的起始索引 pat,如果没有匹配则返回0。如果 expr或者 pat是NULL,返回值是NULL。字符索引从1开始。
- 参数:
- pos:expr开始搜索的位置。如果省略,则默认值为1。
- occurrence:要搜索哪个匹配项(比如存在多个匹配项)。如果省略,则默认值为1。
- return_option:返回哪种类型的职位。如果此值为0,则返回匹配的子字符串的第一个字符的位置。如果此值为1,则返回匹配的子字符串后面的位置。如果省略,则默认值为0。
- match_type:一个字符串,指定如何执行匹配。指定 字符串如下:
- c:区分大小写匹配
- i:不区分大小写的匹配
- m:多行模式。识别字符串中的行终止符。默认行为是仅在字符串表达式的开头和结尾处匹配行终止符。
- n:. 字符匹配行终止符。默认设置是 .匹配以在行尾停止。
- u:仅限Unix的行结尾。只有换行字符识别为结束一条线.,^以及 $匹配运算符。
select regexp_instr('小明身高178cm,体重70kg。','[0-9]+',1,2,0); -- return:13 select regexp_instr('小明身高178cm,体重70kg。','[0-9]+',1,2,1); -- 15,右开,查找匹配最后一个位置是字母‘k’在的位置
- REGEXP_LIKE
- REGEXP_LIKE(expr, pat[, match_type])
- 如果字符串expr 与模式指定的正则表达式匹配,则 返回1,否则返回0。如果 expr或者 pat是NULL,返回值是NULL。
- match-type参数同REGEXP_INSTR。
select regexp_like('数字','[0-9]*'); -- 这里的‘*’表示0个或多个,所以可以匹配到,返回1,若改成‘+’号一个或多个就返回0。
- REGEXP_REPLACE
- REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
- 将字符串 expr中与模式指定的正则表达式匹配的匹配项 pat替换为替换字符串 repl,并返回结果字符串。如果expr, pat或者 repl就是 NULL,返回值 NULL。
- 可选参数:
- pos: expr开始搜索的位置。如果省略,则默认值为1
- occurrence:要替换哪个匹配项。如果省略,则默认值为0(表示“ 替换所有出现次数 ”)。
- match_type:一个字符串,指定如何执行匹配。含义如上所述 REGEXP_LIKE。
select regexp_replace('小明身高175cm','[0-9]+','**'); -- 小明身高**cm
- REGEXP_SUBSTR
- REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
- 如果没有匹配,则 返回null,匹配到则返回与expr模式指定的正则表达式匹配 的字符串的子字符串 。
- pos、occurrence、match_type可选参数跟上面函数提到的用法是一样的。
select regexp_substr('小明身高175cm','[0-9]+'); -- 175 select regexp_substr('小明身高','[0-9]+'); -- null
PS:
- mysql的正则表达式字符串处理功能相对一些编程语言来说还是比较有限,不过对于某些模糊查找匹配还是比较方便,当然也可以先把数据提取出来,再用其他语言对数据进行处理。