MySQL对正则表达式的支持——regexp_substr函数
符号描述^匹配字符串的开始位置,例如:'^abc',表示匹配字符串是否以abc开头。$匹配字符串的结束位置,例如:'abc$',表示匹配字符串是否以abc结尾。.匹配任何单个字符,但不可以匹配'\n',如果需要匹配包括'\n'在内的任何字符,需要使用'[.\n]'。[...] 匹配'[]'中包含的任意一个字符,例如:'[abc]'可以匹配 'a'或'b'或'c'。[^...]匹配未包含的
正则表达式的功能强大,能够帮我们处理一些复杂的需求,因此很多语言都很好的支持了正则表达式。
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年之后的所有茅台酒
分析:年份以及是否为茅台的信息都隐含在商品的名称中
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'等不常用的取值
除了在查询语句中使用之外,我们常常还会从某一个字段中提取字符串来插入新的列。在本例子中,为了以后更好的进行数据分析,我们需要从商品名称中提取出年份信息并单独作为一列。
- 首先给表格新增一列,改变表结构。
alter table store add (pro_time varchar(255))
- 然后向新列中填充数据
update store
set pro_time = regexp_substr(productName,'[0-9]{4}年|[0-9]{2}年代([早中晚]期)*')
结果如下:
对于regexp_substr函数的其他用法,读者可以自行试验进行学习。
更多推荐

所有评论(0)