MySql正则表达式:
1):^是头匹配
mysql> delimiter //
mysql> select 'fnoo' regexp '^f';//
结果是1
^配合组合单元():
mysql> select 'fnoo' regexp '^(fno)';//
也就是以fno打头的字符串,上面的结果当然也是1
2):$匹配尾部
mysql> select 'fno' regexp '^(fn)o$';//
结果为1
正则语义为:匹配fn打头o结尾的字符串,这里也就是相当于"=fno"
3):*和.
任一匹配(0次或者多次)和单个任一字符正则语义符.
对于上面的问题,假如字符串是'fnobodfo'我们怎样匹配呢?
可能用正则语义表述就是:fn开头(^fn)o结尾(o$),中间匹配任一字符(.*)
然后我们拼接出来就是:
mysql>select 'fnobodfo' regexp '^fn.*o$';//
结果为1匹配成功。
4):+和?
正则语义:匹配1个或者多个和匹配0个或者1个
mysql> select 'abbbba' regexp '^ab+a$';//
结果为1
mysql> select 'abbbba' regexp 'ab?a';//
结果为0
进一步:
mysql> select 'abbbb' regexp 'ab?';//
+----------------------+
|1 |
+----------------------+
mysql> select 'abbbb' regexp '^ab?';//
+-----------------------+
| 1 |
+-----------------------+
上面这条语句的正则语义是:以a打头,第二位为b或者不是b的,且任一多字符结尾
的字符串.
其实这条语句也直接可以写成:
mysql> select 'abbbb' regexp '^a';//
这样反而更加清晰,别人也容易理解。
mysql> select 'abbbb' regexp '^ab?$';//
+------------------------+
| 0 |
+------------------------+
上面的正则语义:a打头,以b或者没有任何字符结尾的字符串,所以这个只有两种字
符串匹配:a和ab
5): ()和|
组合单元和或者
mysql> select 'abcbcd' regexp 'a(bc)*d';
-> //
结果为1
mysql>select 'ababd' regexp 'aa|b*d';//
结果为1
正则语义:a打头,a或者b在中间匹配0次或者多次,d结尾。
延伸:
mysql> select 'ababd' regexp 'd$';//-->可以写成'.*d$'
+---------------------+
| 1 |
+---------------------+
mysql> select 'ababd' regexp '^a';//-->可以写成'^a.*'
+---------------------+
| 1 |
+---------------------+
6):{}
指定匹配次数范围
mysql> select 'addddd' regexp 'ad{1,}';//
正则语义:a打头,d匹配1次或者多次。
mysql> select 'addddd' regexp 'ad{6}';//
mysql> select 'a' regexp 'ad{0,6}';//
其实我感觉我们应该尽量使用{}来取代+,?,*等语义符在可能的情况下,这样也就提
高了正则式的可读性.
但是有一点得注意:
{}的范围是0-255,如果你尝试下面操作:
select expr regexp 'ad{255}',且这时expr字符串中d字符超过了255个,则这时
正则式返回的是1,这算不算是个BUG,还有待证实。
这也是{}不能完全取代:+,*的原因。
7):[],[^ ]和[a-b]
mysql> select 'abcdef' regexp '^[^a-c]';//
+---------------------------+
| 0 |
+---------------------------+
正则语义:不是a到c范围内开头的。
mysql> select 'abcdef' regexp '^[^b-c]';//
1
8):\\和其他转义符
mysql> select '1+2' regexp '1\\+2';//
mysql> select '1\n2' regexp '1\\\n2';//
记住:mysql下的字符串中是可以用转义符的,像\n \r等.
当然你也可以直接在输入字符串时按回车.
mysql> select '1
'> ' regexp '1\\\n';//
+---------------------+
| 1 |
+---------------------+
9):[[: character_class:]]的使用
其实知道oracle里的正则式,这个也就很容易用了
mysql> select '012365afsdf' regexp '[[:alnum:]]*';//
+-------------------------------------+
| 1 |
+-------------------------------------+
mysql> select '012365afsdf' regexp '[0-9]*';//
+-------------------------------+
| 1 |
+-------------------------------+
另外还有些常用的:
[[:alpha:]]
[[:alnum:]]
[[:blank:]]
[[:digit:]]
[[:lower:]]
[[:upper:]]
[[
unct:]]
上面是mysql下正则式的简单总结。
作者: ocpdba591
发布时间: -09-26