• 匹配修饰符:
  • ^:用来匹配字符串的开始
  • $:用来匹配字符串的结尾。
  • []:方括号中的任何字符都可以匹配,例如[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’在的位置
  • 1
  • 2
  • 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。
  • 1
  • 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
  • 1
  • 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的正则表达式字符串处理功能相对一些编程语言来说还是比较有限,不过对于某些模糊查找匹配还是比较方便,当然也可以先把数据提取出来,再用其他语言对数据进行处理。