正则表达式
正则表达式与like的区别看下面的两个例子
mysql> select shop_price from goods where shop_price regexp '.311'; +------------+ | shop_price | +------------+ | 1311.00 | +------------+ 1 row in set (0.00 sec) mysql> select shop_price from goods where shop_price like '1311'; Empty set (0.00 sec)
上语句说明like匹配整个列,如果被匹配的文本在列值中出现,like将找不到它,相应的行也不会被返回(除非使用通配符)
mysql> select shop_price from goods where shop_price like '%311.00'; +------------+ | shop_price | +------------+ | 1311.00 | +------------+
而 regexp在列值中进行匹配,如果被匹配的文本在列值中出现,regexp将会找到它,相应的行被返回
在正则表达式中 圆点 . 可以匹配任意一个字符 类似于like中的 下划线
只要存在,哪怕是在一个值中的一部分也会通过正则表达式找出来 如下
mysql> select shop_price from goods where shop_price regexp '13'; +------------+ | shop_price | +------------+ | 1388.00 | | 1328.00 | | 1300.00 | | 1311.00 | | 1337.00 | +------------+ 5 rows in set (0.00 sec)
使用 | 功能上类似 or 或者的意思
select shop_price from goods where shop_price regexp '3|56';
匹配几个字符之一
如果想匹配特定的字符,可以通过指定一组用[]括起来的字符来完成 如下
mysql> select goods_name from goods where goods_name regexp '[ce]'; +------------------------+ | goods_name | +------------------------+ | 诺基亚E66 | | 索爱C702c | | 索爱C702c | | 诺基亚5320 XpressMusic | | 三星BC01 | | 多普达Touch HD | | 摩托罗拉E8 | +------------------------+ 7 rows in set (0.00 sec)
字符集合也可以否定,尽管[ce]匹配了所有的含有 c 或者e 的值,但是[^ce]却是除了这些的值 ^ 是否定改字符集,一定要在[]之内
范围可以用 - 定义 例如 [0-9] 或者 [3-7] 或者字母 [a-z]
注意 如果要查找 . 或者 | 或者 [] 这样的值会发生歧义怎么办,要在 字符前面加 \\ 为前导 如下
select name from goods where name regexp '\\.';
多数数据库要求使用一个\转义 mysql要求使用两个 mysql转义一个 正则表达式库转义一个
重复元字符
| 元字符 | 说明 |
| * | 0个或者多个匹配 |
| + | 1个或者多个匹配(等于{1,}) |
| ? | 0个或者1个匹配(等于{0,1}) |
| {n} | 指定数目的匹配 |
| {n,} | 不少于指定数目的匹配 |
| {n,m} | 匹配数目的范围(m不超过255) |
select name from goods where name regexp '\\([0-9] sticks?\\)';
解释一下上语句的正则表达式
[0-9]匹配任意数字;
stick?匹配stick和sticks(s后的?是s可选,因为?匹配它前面的任何字符的0次或者1次出现)
\\) 匹配 )
如果没有? 匹配stick和sticks就会非常困难
| 类 | 说明 |
| [:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
| [:alpha:] | 任意字符 (同[a-zA-Z]) |
| [:blank:] | 空格和制表 (同[\\t]) |
| [:cntrl:] | ASCII控制字符 |
| [:digit:] | 任意数字 (同[0-9]) |
| [:graph:] | 与[:print:] 相同,但是不包括空格 |
| [:print:] | 任意可打印字符 |
| [:lower:] | 任意小写字母 (同[a-z]) |
| [:punct:] | 既不在[:alnum:]又不在[:cntrl:]的任意字符 |
| [:space:] | 包括空格在内的任意空白字符 |
| [:upper:] | 任意大写字母(同[A-Z]) |
| [:xdigit:] | 任意十六制数字 (同[a-fA-F0-9]) |
例
select name from goods where name regexp '[[:digit:]]{4}';
解释
[:digit:]匹配任意数字,因而它为数字的一个集合。
{4}确切的要求它前面的字符(任意数字)出现4次
所以[[:digit:]]{4} 匹配连在一起的任意4位数字
上面的正则表达式也可以如下写
‘[0-9][0-9][0-9][0-9]’
定位元素符
| 元字符 | 说明 |
| ^ | 文本的开始 |
| $ | 文本的结尾 |
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
如果想找一个以数字开头的文本,简单搜索[0-9\\.]不行,因为它将文本任意位置查找匹配,只能使用定位
select name from goods regexp '^[0-9\\.]';
^匹配串的开始,因此^[0-9\\.]只在任意数字开头的字符串才匹配它们

浙公网安备 33010602011771号