您现在的位置是:网站首页> 编程资料编程资料
MySQL正则表达式REGEXP使用详解_Mysql_
2023-05-26
841人已围观
简介 MySQL正则表达式REGEXP使用详解_Mysql_
正则表达式用来匹配文本的特殊的串(字符集合)(匹配文本,将一个模式(正则表达式)与一个文本串进行比较)。
LIKE 和 REGEXP之间的重要差别
LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE 将不会找到它,相应的行也不会被返回(除非使用通配符)。而 REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP 将会找到它,相应的行将被返回,并且 REGEXP 能匹配整个列值(与 LIKE 相同的作用)。
正则表达式匹配不区分大小写
MySQL 的正则表达式匹配(自3.23.4版本后)不区分大小写(即大写和小写都匹配)。为区分大小写,可以使用 BINARY 关键字,例如:WHHERE name REGEXP BINARY 'Hern .000'。
简单的正则表达式测试
可以在不使用数据库表的情况下用 SELECT 语句来测试正则表达式,REGEXP 检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的 REGEXP 来测试表达式,并试验它们。
例如:检测 'Hern' 中是否含有数字
SELECT 'Hern' REGEXP '[0-9]';
结果将返回0(因为 ‘Hern’ 中没有数字)
空白元字符(特殊含义的字符)
用双反斜杠(\\)来引用元字符(具有特殊含义的字符)。常用引用元字符:
| 字符 | 其它信息 |
|---|---|
| [ 和 ] | 左右方括号用于指定字符类。字符类是进行匹配时所要依据的一组字符。 除连字符 (-) 和脱字符 (^) 外,在字符类中指定的元字符和量词(如 * 和 {m},分别为元字符和量词)没有特殊意义,可当作实际字符进行运算。 |
| * | 星号可用于与字符匹配 0 次或多次。例如,REGEXP '.*abc' 匹配的字符串以 abc 结尾并以任何前缀开头。因此,aabc、xyzabc 和 abc 匹配,但 bc 和 abcc 则不匹配。 |
| ? | 问号可用于与字符匹配 0 次或 1 次。例如,'colou?r' 匹配 color 和 colour。 |
| + | 加号可用于与字符匹配 1 次或多次。例如,'bre+' 匹配 bre 和 bree,但不匹配 br。 |
| - | 可以在字符类中使用一个连字符来表示一个范围。例如, |
| % | 百分号可与 SIMILAR TO 配合使用来匹配任意数目的字符。 不将百分号视为 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。当指定时,它匹配百分号 (%)。 |
| _(下划线字符) | 可将下划线与 SIMILAR TO 配合使用来匹配单个字符。 不将下划线视为 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。当指定时,它匹配下划线 (_)。 |
| | | 管道符号用于指定匹配字符串时要使用的替代模式。在由竖线分隔的一行模式中,竖线被解释为 OR,匹配过程从最左侧的模式开始,在找到第一个匹配项时停止。因此,您应按优先级的降序顺序列出模式。您可以指定任意数量的替代模式。 |
| ( 和 ) | 当左括号和右括号用于正则表达式的各个组合部分时,它们为元字符。例如,(ab)* 匹配零个或多个 ab 的重复项。与使用数学表达式一样,您使用组合来控制正则表达式各部分的计算顺序。 |
| { 和 } | 当左大括号和右大括号用于指定量词时,它们为元字符。量词指定一个模式要构成某个匹配所必须重复的次数。例如:
|
| \ | 反斜线被用作元字符的转义字符。它也可被用于转义非元字符。 |
| ^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
| $ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
| . | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
| : | 在字符集中使用冒号来指定子字符类。例如, |
注意:
1、多数正则表达式实现使用单个反斜杠转义特殊字符,一遍能使用这些字符本身,但是MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
2、^ 符号的双重用途: ^在集合中(用 [ ] 定义)时用它来否定该集合,否则用来指定串的开始处。
匹配字符类
| 子字符类 | 其它信息 |
|---|---|
| [:alpha:] | 匹配当前归类中的大写和小写字母字符。例如,'[0-9]{3}[[:alpha:]]{2}' 匹配三个数字,后跟两个字母。 |
| [:alnum:] | 匹配当前归类中的数字、大写和小写字母字符。例如,'[[:alnum:]]+' 匹配含有一个或多个字母和数字的字符串。 |
| [:digit:] | 匹配当前归类中的数字。例如,'[[:digit:]-]+' 匹配含有一个或多个数字或横线的字符串。同样,'[^[:digit:]-]+' 匹配含有一个或多个不是数字或横线的字符的字符串。 |
| [:lower:] | 匹配当前归类中的小写字母字符。例如,'[[:lower:]]' 不匹配 A,因为 A 为大写。 |
| [:space:] | 匹配单个空格 (' ')。例如,搜索 Contacts.City 以查找任何名称为两个词的城市: SELECT City FROM Contacts WHERE City REGEXP '.*[[:space:]].*'; |
| [:upper:] | 匹配当前归类中的大写字母字符。例如, |
| [:whitespace:] | 匹配一个空白字符,例如,空格、制表符、换页符和回车符。 |
| [:ascii:] | 匹配任何七位的 ASCII 字符(0 到 127 之间的顺序值)。 |
| [:blank:] | 匹配一个空白区或水平制表符。
|
| [:cntrl:] | 匹配顺序值小于 32 或字符值为 127 的 ASCII 字符(控制字符)。控制字符包括换行符、换页符、退格符,等等。 |
| [:graph:] | 匹配打印字符。
|
| [:print:] | 匹配打印字符和空格。
|
| [:punct:] | 匹配其中一个字符: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
|
| [:word:] | 匹配当前归类中的字母、数字或下划线字符。
|
| [:xdigit:] | 匹配字符类 [0-9A-Fa-f] 中的字符。 |
正则表达式支持的其它语法约定
| 正则表达式语法 | 名称和含义 |
|---|---|
| \0xxx | 匹配值为 \0xxx 的字符,其中 xxx 是任何八进制数字序列,0 是零。例如, |
| \a | 匹配报警字符。 |
| \A | 用在字符集外部以便匹配字符串的开头。 等效于在字符集外部使用的 |
| \b | 匹配退格字符。 |
| \B | 匹配反斜线字符 (\)。 |
| \cX | 匹配已命名的控制字符。例如,\cZ 代表 ctrl-Z。 |
| \d | 匹配当前归类中的一个数字。例如,以下语句搜索 Contacts.Phone 以查找以 00 结尾的所有电话号码: SELECT Surname, Surname, City, Phone FROM Contacts WHERE Phone REGEXP '\\d{8}00';\d 既可用在字符类的内部也可用在字符类的外部,等效于 |
| \D | 匹配数字以外的任何字符。它的作用与 \d 正好相反。 \D 既可用在字符类的内部也可用在字符类的外部,等效于 在方括号内使用取非速记时请务必谨慎。 |
| \e | 匹配转义字符。 |
| \E | 将由 \Q 启动的将元字符视为非元字符这一功能停止。 |
| \f | 匹配换页符。 |
| \n | 匹配换行符。 |
| \Q | 将所有元字符视为非元字符,直到遇到 \E。例如, |
| \r | 匹配回车符。 |
| \s | 匹配一个被视为白空格的空格或字符。例如,从 Products.ProductName 中返回名称中至少有一个空格的所有产品名: SELECT Name FROM Products WHERE Name REGEXP '.*\\s.*'; \s 既可用在字符类的内部也可用在字符类的外部,等效于 |
| \S | 匹配非白空格字符。它的作用与 \d 正好相反,而等效于 \S 既可用在字符类的内部也可用在字符类的外部。 在方括号内使用取非速记时请务必谨慎。 |
| \t | 匹配水平制表符。 |
| \v | 匹配垂直制表符。 |
| \w | 匹配当前归类中的字母字符、数字或下划线。例如,从 Contacts.Surname 返回长度正好为七个字母数字字符的所有姓: SELECT Surname FROM Contacts WHERE Surname REGEXP '\\w{7}';\w 既可用在字符类的内部也可用在字符类的外部。等效于 |
| \W | 匹配当前归类中字母字符、数字或下划线以外的任何字符。它的作用与 \w 正好相反,而等效于 在字符类的内部和外部都可使用此正则表达式。 |
