mysql-正则表达式的使用

mysql-正则表达式的使用

使用环境: 8.0.12 MySQL+win10,不同环境可能会有些许差异。

官方文档参考:Click me


  • 匹配修饰符:
    • ^:用来匹配字符串的开始
    • $:用来匹配字符串的结尾。
    • []:方括号中的任何字符都可以匹配,例如[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 REGEXPREGEXP的否定
REGEXPstring是否匹配正则表达式
REGEXP_INSTR()匹配正则表达式的子串的起始索引
REGEXP_LIKE()string是否匹配正则表达式
REGEXP_REPLACE()替换匹配正则表达式的子字符串
REGEXP_SUBSTR()返回子串匹配正则表达式
RLIKEstring是否匹配正则表达式
  • 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的正则表达式字符串处理功能相对一些编程语言来说还是比较有限,不过对于某些模糊查找匹配还是比较方便,当然也可以先把数据提取出来,再用其他语言对数据进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值