zoukankan      html  css  js  c++  java
  • 第九章 用正则表达式进行搜索

    学习目的:
    如何在MySQL WHERE子句内使用正则表达式来更好控制数据过滤。
     
    正则表达式介绍:
    正则表达式是用来匹配文本的特殊的串(字符集合)。
    所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式。
     
    使用MySQL正则表达式:
    基本字符匹配:
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '.000'
    ORDER BY prod_name;
    . 是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符,因此1000和2000都能匹配。
    LIKE匹配整个列,如果配匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)
    REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回,这是一个非常重要的差别。
    匹配不区分大小写:如果要区分大小写,要用BINARY关键字。如 WNERE prod_name REGEXP BINARY 'JecPack .000'。
     
    进行OR匹配:
    为搜索两个串之一(或者为另一个串),使用|。
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '1000|2000'
    ORDER BY prod_name;
     
    两个以上的OR条件:可以给出两个以上的OR条件。如'1000|2000|3000|'.
     
    匹配几个字符之一:
    如果你只想匹配特定的字符,怎么办?可通过指定一组用[和]括起来的字符来完成。
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '[123] Ton'
    ORDER BY prod_name;
    其中'[123] Ton'是'[1|2|3] Ton'的简写。
    字符集也可以被否定。为否定一个字符集,在集合的开始出放置一个^即可。如[^123]
     
    匹配范围:
    集合可用来定义要匹配的一个或多个字符。例如,下列的集合将匹配0到9,
    [0123456789]为简化这中写法,可写为[0-9]。范围不限于完整的集合。[1-3],[6-9]也是合法的。此外。范围不一定是数值,[A-Z]匹配任意字母字符。
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '[1-5] Ton'
    ORDER BY prod_name;
     
    匹配特殊字符:
    例如要找出包含.字符的值,怎么搜索?为了匹配特殊字符,必须用\为前导。\-表示查找-。
    SELECT vend_name
    FROM vendors
    WHERE vend_name REGEXP '\ .'
    ORDER BY vend_name;
     
    这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须用这种方式转义。
     
    \ 也用来引用元字符(含有特殊意义的字符),如下所列
    \ f   换页
    \ n  换行
    \ r   回车
    \ t   制表
    \ v  纵向制表
     
    为了匹配反斜杠本身,必须使用\
     
    或\,多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身,但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
     
    匹配字符类:
    存在找出你自己经常使用的数字,所有字母字符或所有数字字母等的匹配。
     
    字符类(预定义字符集):
    说明
    [:alnum:]
    任意字母和数字
    [:alpha:]
    任意字符
    [:blank:]
    空格和制表
    [:cntrl:]
    ASCII控制字符
    [:digit:]
    任意数字
    [:graph:]
    与[:print:]相同,但不包括空格
    [:lower:]
    任意小写字母
    [:print:]
    任意可打印字符
    [:punct:]
    既不在[:alnum]又不在[:cntrl]中的字符
    [:space:]
    包括空格在内的任意空白字符
    [:upper:]
    任意大写字母
    [:xdigit:]
    任意十六进制数字
     
    匹配多个实例:
    元字符
    说明
    *
    0个或多个匹配
    +
    一个或多个匹配(等于{1,0})
    ?
    0个或一个匹配(等一{0,1})
    {n}
    指定数目的匹配
    {n, }
    不少于指定数目的匹配
    {n,m}
    匹配数目的范围(m不超过255)
     
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '\([0-9] sticks?\)'
    ORDER BY prod_name;
    正则表达式\([0-9] sticks?\)需要解说一下。\(匹配),
    [0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick 和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\)匹配)。没有?,匹配stick和sticks会非常困难。
     
    定位符:
    目前为止的所有例子都是匹配一个串中任意为止的文本。为了匹配特定为止的文本,需要使用如下列出的定位符。
    元字符
    说明
    ^
    文本的开始
    $
    文本的结尾
    [[:<:]]
    词的开始
    [[:>:]]
    词的结尾
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '^[0-9\]'
    ORDER BY prod_name;
     
    简单的正则表达式测试:
    可以在不适用数据库表的情况在用SELECT来测试正则表达式。REGEXP检查总是返回0(么没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并实验它们。如:
    SELECT 'hello' REGEXP '[0-9]'
    返回0
     
     
     
     

  • 相关阅读:
    如何使用PhoneGap打包Web App
    js获取鼠标点击事件的相对位置
    IDEA跳转到上一个下一个方法的快捷键
    JunitGenerator
    无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类
    IntelliJ IDEA 2019.3注册码(亲测有效,可激活至 2089 年)
    NACOS MalformedInputException 无法读取中文配置问题
    maven maven-surefire-plugin的乱码问题
    Idea单元测试Junit Generator设置
    Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
  • 原文地址:https://www.cnblogs.com/mumulin99/p/9837737.html
Copyright © 2011-2022 走看看