首页 > 数据库 > MySQL > 正文

mysql正则REGEXP学习练习笔记

2024-07-24 12:36:56
字体:
来源:转载
供稿:网友

REGEXP在mysql是用来执行正则表达式的一个函数,像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看.

MySql用户手册建议,在构造简单查询时,仍使用通配符.如:Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

但在一些特殊查询中,不用正则表达式是不行的,MYSQL提供的正则表达式WHERE谓词有三个,分别是:REGEXP, RLIKE, NOT RLIKE

用这三个替换原有的LIKE谓词,后面即可以跟正则表达式,例如要查询字段中含有“_”的数据,则要用以下查询语句:

SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

扩展正则表达式的一些字符是:

· ‘.’匹配任何单个的字符.

· 字符类“[...]”匹配在方括号内的任何字符,例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”,“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字.

· “ * ”匹配零个或多个在它前面的字符,例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符.

如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。

为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”.

为了找出以“b”开头的名字,使用“^”匹配名字的开始,使用正则:

  1. SELECT * FROM pet WHERE name REGEXP BINARY ‘^b’; 
  2. SELECT * FROM pet WHERE name REGEXP ‘fy$’; 
  3. SELECT * FROM pet WHERE name REGEXP ‘w’; 
  4. SELECT * FROM pet WHERE name REGEXP ‘^…..$’; 
  5. SELECT * FROM pet WHERE name REGEXP ‘^.{5}$’; 

今天在应用中遇到了这样的一个问题,有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2.

需要从里面搜索出比如说,第一个逗号前的数字范围为3-5之间,第三个逗号前的数字的范围为3-5之间,第10个逗号前的数字范围为3-5之间,其余的都为1-5之间.

则sql语句可以这么写:SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';

1. 使用LIKE和NOT LIKE比较操作符(注意不能使用=或!=);

2. 模式默认是忽略大小写的;

3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);

附一些mysql正则规则

^      匹配字符串的开始部分

$      匹配字符串的结束部分

.      匹配任何字符(包括回车和新行)

a*     匹配0或多个a字符的任何序列

a+     匹配1个或多个a字符的任何序列

a?     匹配0个或1个a字符

de|abc    匹配序列de或abc

(abc)*     匹配序列adc的0个或者多个实例

{n}、{m,n}    {n}或{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或“部分”),m和n均为整数.

a*       可被写为a{0,}

a+       可被写为a{1,}

a?       可被写为a{0,1}

[a-dX]      匹配任何是a,b,c,d或者X的字符,两个其他字符之间的’-'字符构成一个范围

[^a-dX]    匹配任何不是a,b,c,d或者X的字符,前面的字符’^'是否定的意思.

[.characters.]  在括号表达式中(使用[和]),匹配用于校对元素的字符序列,字符为单个字符或新行等字符名.

  1. mysql> SELECT ‘~’ REGEXP ‘[[.~.]]’;                                                        -> 1 
  2. mysql> SELECT ‘~’ REGEXP ‘[[.tilde.]]’;                                                 -> 1 
  3.  
  4. [=character_class=] 

在括号表达式中(使用[和]),[=character_class=]表示等同类,它与具有相同校对值的所有字符匹配,包括它本身.

[[=a=]]  等同于[a(+)],[a+],[a{1,}]

[:character_class:],在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类.

标准的类名称是:

  1. alnum       文字数字字符 
  2. alpha        文字字符 
  3. blank         空白字符 
  4. cntrl          控制字符 
  5. digit          数字字符 
  6. graph        图形字符 
  7. lower        小写文字字符 
  8. print          图形或空格字符 
  9. punct        标点字符 
  10. space        空格、制表符、新行、和回车 
  11. upper        大写文字字符 
  12. xdigit        十六进制数字字符  //Vevb.com 

[[:<:]], [[:>:]]:这些标记表示word边界,它们分别与word的开始和结束匹配,word是一系列字字符,其前面和后面均没有字字符,字符是alnum类中的字母数字字符或下划线(_).

  1. mysql> select ‘fang shan zi’ regexp ‘[[:<:]]shan[[:>:]]’;             -> 1 
  2. mysql> select ‘fang shan zi’ regexp ‘[[:<:]]fang[[:>:]]’;              -> 1 
  3. mysql> select ‘fang shans zi’ regexp ‘[[:<:]]shan[[:>:]]’;           -> 0 

正则表达式使用特殊字符,应在其前面加上2个反斜杠’'字符:

  1. mysql> SELECT ’1+2′ REGEXP ’1+2′;                       -> 0 
  2. mysql> SELECT ’1+2′ REGEXP ’1+2′;                      -> 0 
  3. mysql> SELECT ’1+2′ REGEXP ’1/+2′;                     -> 1

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表