MySQL对正则表达式的支持——regexp_substr函数

正则表达式的功能强大,能够帮我们处理一些复杂的需求,因此很多语言都很好的支持了正则表达式。
MySQL对正则表达式的支持如下所示:

元字符 功能说明
^ 匹配字符串的开始位置,例如:'^abc',表示匹配字符串是否以abc开头。
$ 匹配字符串的结束位置,例如:'abc$',表示匹配字符串是否以abc结尾。
. 匹配任何单个字符,但不可以匹配'\n',如果需要匹配包括'\n'在内的任何字符,需要使用'[.\n]'。
[...]  匹配'[]'中包含的任意一个字符,例如:'[abc]'可以匹配 'a'或'b'或'c'。
[^...] 匹配未包含的任意字符,例如: '[^abc]' 可以匹配除abc以外的任何字符。
(...) 匹配'()'中的所有字符,例如:'(abc)'可以匹配'abcdefg',但是不可以匹配'a','ab'。
(^...) 匹配未包含在'()'中的所有字符,例如:'(^abc)'可以匹配'abdefg','bcdefg',但是不可以匹配
'abcdefg'。
a|b|c 匹配'a'或'b'或'c',例如:'f|good'可以匹配 'f'或 'good',但是'(f|g)ood'则匹配 'food'或 'good'。
* 匹配表达式0~n次,例如:'go*'可以匹配 'g','go','goo'。
匹配表达式1~n次,例如:'go+'可以匹配 'go','goo',但不可以匹配 'g'。
{n} 匹配表达式n次。
{n,m} 匹配表达式最少匹配 n次且最多匹配 m次。

可以看到,MySQL对正则表达式的支持并不是很全,类似“\d,\D,\s,\S”等元字符在MySQL中是不被支持的。

1、正则在MySQL中的用法

在查询语句中配合regexp关键字在where子句中使用
例:where 字段名 regexp ‘正则表达式’

现有表格(store)如下,要求查出所有2010年之后的所有茅台酒
MySQL对正则表达式的支持——regexp_substr函数_第1张图片
分析:年份以及是否为茅台的信息都隐含在商品的名称中

select *
from store 
where productName regexp '茅台' and productName regexp '201[1-9]|202[0-9]'

结果如下:
在这里插入图片描述
这是一种很简单也很常用的用法。


update语句中使用regexp_substr函数实现
regexp_substr(source_char,pattern,position,occurrence,match_parameter)

regexp_substr函数有五个可选参数。他们的作用分别如下:

  • source_char是目标字符串。必选参数。它通常是表中的一个字符列,可以是任何数据类型CHAR,VARCHAR2, NCHAR, NVARCHAR2, CLOB, 或NCLOB。

  • pattern是正则表达式。必选参数。它通常是一个文本文字。

  • position是一个正整数。可选参数。指示应从source_char的何处开始搜索满足正则表达式的字符串。默认值为 1,这意味着从source_char 的第一个字符开始搜索。

  • occurrence是一个正整数。可选参数。指示返回第几个满足正则的字符串。默认值为 1,这意味着返回第一次出现的pattern。
    说明:当满足正则表达式的不止一处时,该参数才有意义

  • match_parameter是一个文本文字。可选参数。可让您更改函数的默认匹配行为。有以下几个取值:

      1. 'i' (默认值)表示不区分大小写的匹配。
      2. 'c' 表示区分大小写的匹配。
      3. 'm'将源字符串视为多行。MySQL将^和$分别解释为源字符串中任意行的开头和结尾,而不是仅在整个源字符串的开头或结尾处。如果省略此参数,MySQL会将源字符串视为单行。
      除了以上取值较为常用之外,还有'u','n'等不常用的取值
    

除了在查询语句中使用之外,我们常常还会从某一个字段中提取字符串来插入新的列。在本例子中,为了以后更好的进行数据分析,我们需要从商品名称中提取出年份信息并单独作为一列。

  1. 首先给表格新增一列,改变表结构。
alter table store add (pro_time varchar(255))
  1. 然后向新列中填充数据
update store 
set pro_time = regexp_substr(productName,'[0-9]{4}年|[0-9]{2}年代([早中晚]期)*')

结果如下:
MySQL对正则表达式的支持——regexp_substr函数_第2张图片
对于regexp_substr函数的其他用法,读者可以自行试验进行学习。

你可能感兴趣的:(数据库技术,字符串,正则表达式,mysql)