zoukankan      html  css  js  c++  java
  • MySQL语句与正则表达式

    正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

    1、元字符说明

    元字符 说明
    ^ 使表达式定位到一行的开头
    $ 使表达式定位到一行的末尾
    元字符   说明
    | 替换 分隔替换选项,通常与分组操作符 () 一起使用
    () 分组 将子表达式分组为一个替换单元、量词单元或后向引用单元
    [char] 字符列表 表示一个字符列表;一个字符列表中的大多数元字符(除字符类、^ 和 - 元字符之外)被理解为文字

    2、进行OR匹配

    为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP'1000|2000'
    ORDER BY prod_name;

    语句中使用了正则表达式1000|2000。 |为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。
    使用|从功能上类似于在SELECT语句中使用OR语句, 多个OR条件可并入单个正则表达式。

    两个以上的OR条件 可以给出两个以上的OR条件。例如,'1000 | 2000 | 3000'将匹配1000或2000或3000。

    3、匹配几个字符之一

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP [123]Ton'
    ORDER BY prod_name;

    这里,使用了正则表达式[123] Ton。 [123]定义一组字符,它的意思是匹配1或2或3,因此, 1 ton和2 ton都匹配且返回(没有3 ton)。
    正如所见, []是另一种形式的OR语句。 事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写,也可以使用后者。

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP'1|2|3 Ton'
    ORDER BY prod_name;

    检索结果并不跟上面相同,而是'1'或'2'或'3 ton'。

    字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^即可。因此,尽管[123]匹配字符1、 2或3,但[^123]却匹配除这些字符外的任何东西。

    4、匹配范围

    集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字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;

    这里使用正则表达式[1-5] Ton。 [1-5]定义了一个范围,这个表达式意思是匹配1到5,因此返回3个匹配行。由于5 ton匹配,所以返回.5 ton。

    5、匹配特殊字符

     为了匹配特殊字符,必须用\为前导。\-表示查找-, \.表示查找.。

    正则表达式语言由具有特定含义的特殊字符构成。我们已经看到.、[]、|和-等,还有其他一些字符。请问,如果你需要匹配这些字符,应该怎么办呢?例如,如果要找出包含.字符的值,怎样搜索?请看下面的例子:

    SELECT vend_name
    FROM vendors
    WHERE vend_name REGEXP'\.'
    ORDER BY vend_name;

    这才是期望的输出。 \.匹配.,所以只检索出一行。这种处理就是所谓的转义( escaping),正则表达式内具有特殊意义的所
    有字符都必须以这种方式转义。这包括.、 |、 []以及迄今为止使用过的其他特殊字符。

    空白元字符

    元字符 说明
    \f 换页
    \n 换行
    \r 回车
    \t 制表
    \v 纵向制表

     匹配   为了匹配反斜杠( )字符本身,需要使用\。

    6、匹配字符类

    存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类( character class)。

    字符类

    说明
    [:alnum:] 任意字母和数字(同[a-zA-Z0-9])
    [:alpha:] 任意字符(同[a-zA-Z])
    [:blank:] 空格和制表(同[\t])
    [:cntrl:] ASCII控制字符( ASCII 0到31和127)
    [:digit:] 任意数字(同[0-9])
    [:graph:] 与[:print:]相同,但不包括空格
    [:lower:] 任意小写字母(同[a-z])
    [:print:] 任意可打印字符
    [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
    [:space:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])
    [:upper:]  任意大写字母(同[A-Z])
    [:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

    7、匹配多个实例

    例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等。

    重复元字符

    元字符 说明
    * 0个或多个匹配
    + 1个或多个匹配(等于{1,})
    0个或1个匹配(等于{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会非常困难。

    下面的例子是匹配连在一起的4位数字:

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '[[:digit:]]{4}
    ORDER BY prod_name;

    [:digit:]匹配任意数字,因而它为数字的一个集合。 {4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。

    除了上面这种表达还有一种方法供大家参考。

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'
    ORDER BY prod_name;

    8、定位符

    为了匹配特定位置的文本,需要使用定位符。

    定位元字符

    元字符 说明
    ^ 文本的开始
    $ 文本的末尾
    [[:<:]] 词的开始
    [[:>:]] 词的结尾

     

    例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\.](或[[:digit:]\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符。

    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '^[0-9\.]'
    ORDER BY prod_name;

    ^匹配串的开始。因此, ^[0-9\.]只在.或任意数字为串中第一个字符时才匹配它们。没有^, 则还要多检索出4个别的行 (那些中间有数字的行)。

    ^的双重用途 ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。

    使REGEXP起类似LIKE的作用  LIKE和REGEXP的不同在于, LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。

    简单的正则表达式测试 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0 (没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。相应的语法如下:
    SELECT 'hello' REGEXP '[0-9]';
    这个例子显然将返回0(因为文本hello中没有数字)。

  • 相关阅读:
    Servlet的数据库访问
    Servlet 网页重定向
    Intellij idea创建javaWeb以及Servlet简单实现
    Tomcat
    QQ简易版
    单例
    centos7 jdk安装
    centos7 allure安装
    centos中执行apt-get命令提示apt-get command not found
    centos mysql使用踩过的坑
  • 原文地址:https://www.cnblogs.com/ruoli-121288/p/13230658.html
Copyright © 2011-2022 走看看