正则表达式

正则表达式与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\\.]只在任意数字开头的字符串才匹配它们

posted @ 2013-11-26 01:18  long896130895  阅读(509)  评论(0)    收藏  举报