sql select(语句) (where)正则表达式
正则表达式介绍:正则表达式是用来匹配文本的特殊的串(字符集合)。
所有种类的程序设计语言,文本编译器,操作系统等都支持正则表达式。
- 使用MySQL正则表达式
1. 基本字符匹配
SELECT * FROM ms_user WHERE name REGEXP 'wz.';
除关键字 LIKE 的语句被REGEXP替代外,这条语句看上去非常像LIKE的语句。
LIKE : 是告诉MySQL,后边跟的是通配符。
同理
REGEXP :就是告诉MySQL,后边跟的是正则表达式。
SELECT * FROM ms_user WHERE name REGEXP 'wzy';
SELECT * FROM ms_user WHERE name LIKE 'wzy';
注:比较上述语句。LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不会返回(除非使用通配符),而REGEXP可以
- 进行 OR 匹配 ‘ | ’
SELECT * FROM ms_user WHERE name REGEXP 'wang|ze';
# 这条语句功能与 or语句类似 相当于 WHERE name = 'wang' or name = 'ze';
-
匹配几个字符之一
匹配任何单一字符,如果你只想匹配特定得字符,那我们通过 [ 和 ] 括起来指定的字符来完成; 例: SELECT * FROM ms_user WHERE name REGEXP '[123]lala'; #这里[123] 的意思就是 匹配 以 1,2,3开头其中之一的 lala 字符串。1lala,2lala,3lala 注: [123] 的意思是[1|2|3] 需要加上[] 如果不加,意思就会改变成 1 or 2 or 3lala 字符集也可以被否定 ,我们只需要在集合前加上一个 ^ [^123], 这应 [^123]lala就会得到与上边相反的结果。
-
匹配范围
当匹配的特定字符很多的时候我们会很麻烦,如匹配[0123456789]; 此时我们可以使用 '-' 例: [0-9] 可以起到与[123456789]相同的效果; 注: 范围不限定于完整的集合,[1-3]和[5-8] 也是合法的,此外,范围不一定只是数值,[a-z]匹配任意字母字符。
-
匹配特殊字符
当我们匹配在程序语言中表达特殊意义的字符时(如:|,[,],-)是我们需要用到\\ ,如 \\- 表示 - ,\\[ 表示[,及当我们要表达 \ 时 我们需要用 \\\; \\ 也可以用来引用元字符(具有特殊含义的字符); 元字符 说明 \\f 换页 \\n 换行 \\r 回车 \\t 制表 \\v 纵向制表 注: 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本省,但MySQL要求使用两个反斜杠(MySQL自己解释一个,正则表达式库解释一个)。
-
匹配字符集
正则表达式有预定字符集:
类 说明 [:alnm:] 任意字母和数字[a-zA-Z0-9] [:alpha:] [a-zA-Z]任意字母 [:blank:] [\\t] 空格和制表 [:cntrl:] ASCII控制字符(ASCII 0到37和127) [:digit:] 任意数字[0-9] [:graph:] 同[:print:]但不包含空格 [:lower:] [a-z] 任意小写字母 [:print:] 任意可打印字符 [:punct:] [:alnm:][:cntrl:]除外的字符 [:space:] 包括空格的任意空白字符[\\f\\n\\r\\t\\v] [:upper:] 任意大写字母[A-Z] [:xdigit:] 任意16进制数字[a-fA-F0-9]
-
匹配多个实例
上述到现在,我们知道的都是如何匹配单个字符的,我们可以使用一些元字符来匹配多个字符 元字符 说明 * 0个或多个 + 1个或多个 ? 0个或一个 {n} 指定数目匹配 {n,} 不少于自定数目的匹配 {n,m} 匹配数目范围(m不超过255) 例: SELECT * FROM ms_user WHERE name REGEXP '\\([0-9] wzy?\\)'; \\([0-9] wzy?\\) 其中 \\(和\\)表示匹配括号,[0-9] 表示任意数字, wzy? 表示匹配 wz,wzy; ?的意义是匹配它前边的任何字符的0次或1次。 例: SELECT * FROM ms_user WHERE name REGEXP '[[0-9]]{5}'; 匹配任意数 5 次 ,如:12345 56789 54687 01244;
-
定位符
目前所知,所有例子都是匹配一个子串中任意位置的文本,为了匹配特定位置的文本,我们可以使用定位符。 定位符 说明 ^ 文本的开始 $ 文本的结束 [[:<:]] 词的开始 [[:>:]] 词的结尾 例: SELECT * FROM ms_user WHERE name REGEXP '^[0-9\\.]'; 匹配 name 以 0-9 或 . 开头的数据。 注: ^ 的双重用途, 在[]外百世文本的开始,在[] 中表示否定该集合