mysql字符串怎么完全正则匹配,用regexp

mysql字符串怎么完全正则匹配,用regexp,第1张

以前我要查找数据都是使用like后来发现mysql中也有正则表达式了并且感觉性能要好于like,下面我来给大家分享一下mysql REGEXP正则表达式使用详解,希望此方法对大家有帮助。

MySQL采用Henry Spencer的正则表达式实施,其目标是符合POSIX 10032。请参见附录C:感谢。MySQL采用了扩展的版本,以支持在SQL语句中与REGEXP *** 作符一起使用的模式匹配 *** 作。请参见3347节,“模式匹配”。

在本附录中,归纳了在MySQL中可用于REGEXP *** 作的特殊字符和结构,并给出了一些示例。本附录未包含可在Henry

Spencer的regex(7)手册页面中发现的所有细节。该手册页面包含在MySQL源码分发版中,位于regex目录下的regex7文件中。

正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello。

非平凡的正则表达式采用了特殊的特定结构,从而使得它们能够与1个以上的字符串匹配。例如,正则表达式hello|word匹配字符串hello或字符串word。

作为一个更为复杂的示例,正则表达式B[an]s匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs,以及以B开始、以s结束、并在其中包含任意数目a或n字符的任何其他字符串。

以下是可用于随REGEXP *** 作符的表的模式。

应用示例,查找用户表中Email格式错误的用户记录:

SELECT

FROM users

WHERE email NOT REGEXP '^[A-Z0-9_%-]+@[A-Z0-9-]+[A-Z]{2,4}$'

MySQL数据库中正则表达式的语法,主要包括各种符号的含义。

(^)字符

匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。

mysql> select 'xxxyyy' regexp '^xx';

+-----------------------+

| 'xxxyyy' regexp '^xx' |

+-----------------------+

| 1 |

+-----------------------+

1 row in set (000 sec)

查询xxxyyy字符串中是否以xx开头,结果值为1,表示值为true,满足条件。

($)字符

匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串。

()字符

这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。

()字符

星号匹配0个或多个字符,在它之前必须有内容。如:

mysql> select 'xxxyyy' regexp 'x';

这个SQL语句,正则匹配为true。

(+)字符

加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。

()字符

问号匹配0次或1次。

实例:

现在根据上面的表,可以装置各种不同类型的SQL查询以满足要求。在这里列出一些理解。考虑我们有一个表为person_tbl和有一个字段名为名称:

查询找到所有的名字以'st'开头

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查询找到所有的名字以'ok'结尾

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查询找到所有的名字包函'mar'的字符串

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查询找到所有名称以元音开始和'ok'结束 的

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

一个正则表达式中的可以使用以下保留字

^

所匹配的字符串以后面的字符串开头

mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配)

mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)

$

所匹配的字符串以前面的字符串结尾

mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配)

mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配)

匹配任何字符(包括新行)

mysql> select "fofo" REGEXP "^f"; -> 1(表示匹配)

mysql> select "fonfo" REGEXP "^f"; -> 1(表示匹配)

a

匹配任意多个a(包括空串)

mysql> select "Ban" REGEXP "^Ban"; -> 1(表示匹配)

mysql> select "Baaan" REGEXP "^Ban"; -> 1(表示匹配)

mysql> select "Bn" REGEXP "^Ban"; -> 1(表示匹配)

a+

匹配任意多个a(不包括空串)

mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配)

mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)

a

匹配一个或零个a

mysql> select "Bn" REGEXP "^Ban"; -> 1(表示匹配)

mysql> select "Ban" REGEXP "^Ban"; -> 1(表示匹配)

mysql> select "Baan" REGEXP "^Ban"; -> 0(表示不匹配)

de|abc

匹配de或abc

mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配)

mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配)

mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配)

mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配)

mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配)

mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

(abc)

匹配任意多个abc(包括空串)

mysql> select "pi" REGEXP "^(pi)$"; -> 1(表示匹配)

mysql> select "pip" REGEXP "^(pi)$"; -> 0(表示不匹配)

mysql> select "pipi" REGEXP "^(pi)$"; -> 1(表示匹配)

{1}

{2,3}

这是一个更全面的方法,它可以实现前面好几种保留字的功能

a

可以写成a{0,}

a+

可以写成a{1,}

a

可以写成a{0,1}

在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下(包括i次和j次)。其中的整型参数必须大于等于0,小于等于

RE_DUP_MAX(默认是255)。 如果有两个参数,第二个必须大于等于第一个

[a-dX]

匹配“a”、“b”、“c”、“d”或“X”

[^a-dX]

匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。

“[”、“]”必须成对使用

mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配)

mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配)

mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配)

mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配)

mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

SQL的查询语句中,有时会需要引进正则表达式为其复杂搜索指定模式。下面给出一些Regexp在

MYSQL语句中应用(非全部):

1) ^

匹配字符串的开始部分。

mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0mysql> SELECT 'fofo' REGEXP '^fo'; -> 12) $

匹配字符串的结束部分。

mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 03)

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

mysql> SELECT 'fofo' REGEXP '^f$'; -> 1mysql> SELECT 'fo\r\nfo' REGEXP '^f$'; -> 14)

[:character_class:]

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

alnum

文字数字字符

alpha

文字字符

blank

空白字符

cntrl

控制字符

digit

数字字符

graph

图形字符

lower

小写文字字符

print

图形或空格字符

punct

标点字符

space

空格、制表符、新行、和回车

upper

大写文字字符

xdigit

十六进制数字字符

它们代表在ctype(3)手册页面中定义的字符类。特定地区可能会提供其他类名。字符类不得用作范围的端点。

mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1

mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0

5) [[:<:]], [[:>:]]

这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字

字符。字字符是alnum类中的字母数字字符或下划线(_)。

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1mysql> SELECT 'a xword a' REGEXP

'[[:<:]]word[[:>:]]'; -> 0要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“\”字符。

MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符

串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

mysql> SELECT '1+2' REGEXP '1+2'; -> 0mysql> SELECT '1+2' REGEXP '1\+2'; -> 0mysql> SELECT

'1+2' REGEXP '1\\+2'; -> 1 其他的有关Regexp的语法,可直接参考下表:字符 含意

\ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意

为匹配一个单词的边界。

-或-

对正则表达式功能字符的还原,如""匹配它前面元字符0次或多次,/a/将匹配a,aa,aaa,加了"\"后,/a\/将

只匹配"a"。

^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"

$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"

匹配前面元字符0次或多次,/ba/将匹配b,ba,baa,baaa

+ 匹配前面元字符1次或多次,/ba/将匹配ba,baa,baaa

匹配前面元字符0次或1次,/ba/将匹配b,ba

(x) 匹配x保存x在名为$1$9的变量中

x|y 匹配x或y

{n} 精确匹配n次

{n,} 匹配n次以上

{n,m} 匹配n-m次

[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)

[^xyz] 不匹配这个集合中的任何一个字符

[\b] 匹配一个退格符

\b 匹配一个单词的边界

\B 匹配一个单词的非边界

\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M

\d 匹配一个字数字符,/\d/ = /[0-9]/

\D 匹配一个非字数字符,/\D/ = /[^0-9]/

\n 匹配一个换行符

\r 匹配一个回车符

\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等

\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/

\t 匹配一个制表符

\v 匹配一个重直制表符

\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配

"$598"中的5,等于[a-zA-Z0-9]

\W 匹配一个不可以组成单词的字符,如[\W]匹配"$598"中的$,等于[^a-zA-Z0-9]。

我的想法和下面位朋友差不多,但是可以直接用:

在数据表中加需要约束的那一列的一个约束就行了!表达式如下:

where

([列名]

like

'13[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

注释:[0-9]代表是选任一一个0-9中的数字作为当前位的数字。希望能对你有所帮助和启发。

先看要解析的样例SQL语句:

select from dual

SELECT frOm dual

Select C1,c2 From tb

select c1,c2 from tb

select count() from t1

select c1,c2,c3 from t1 where condi1=1

Select c1,c2,c3 From t1 Where condi1=1

select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2

select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2

Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2

Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2,g3 order by g2,g3

解析效果之一(isSingleLine=false):

原SQL为select from dual

解析后的SQL为

select

from

dual

原SQL为SELECT frOm dual

解析后的SQL为

select

from

dual

原SQL为Select C1,c2 From tb

解析后的SQL为

select

C1,c2

from

tb

原SQL为select c1,c2 from tb

解析后的SQL为

select

c1,c2

from

tb

原SQL为select count() from t1

解析后的SQL为

select

count()

from

t1

原SQL为select c1,c2,c3 from t1 where condi1=1

解析后的SQL为

select

c1,c2,c3

from

t1

where

condi1=1

原SQL为Select c1,c2,c3 From t1 Where condi1=1

解析后的SQL为

select

c1,c2,c3

from

t1

where

condi1=1

原SQL为select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

解析后的SQL为

select

c1,c2,c3

from

t1,t2

where

condi3=3 or condi4=5

order by

o1,o2

原SQL为Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2

解析后的SQL为

select

c1,c2,c3

from

t1,t2

where

condi3=3 or condi4=5

order by

o1,o2

原SQL为select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2

解析后的SQL为

select

c1,c2,c3

from

t1,t2,t3

where

condi1=5 and condi6=6 or condi7=7

group by

g1,g2

原SQL为Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2

解析后的SQL为

select

c1,c2,c3

from

t1,t2,t3

where

condi1=5 and condi6=6 or condi7=7

group by

g1,g2

原SQL为Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2,g3 order by g2,g3

解析后的SQL为

select

c1,c2,c3

from

t1,t2,t3

where

condi1=5 and condi6=6 or condi7=7

group by

g1,g2,g3

order by

g2,g3

解析效果之二(isSingleLine=true):

原SQL为select from dual

解析后的SQL为

select

from

dual

原SQL为SELECT frOm dual

解析后的SQL为

select

from

dual

原SQL为Select C1,c2 From tb

解析后的SQL为

select

C1,

c2

from

tb

原SQL为select c1,c2 from tb

解析后的SQL为

select

c1,

c2

from

tb

原SQL为select count() from t1

解析后的SQL为

select

count()

from

t1

原SQL为select c1,c2,c3 from t1 where condi1=1

解析后的SQL为

select

c1,

c2,

c3

from

t1

where

condi1=1

原SQL为Select c1,c2,c3 From t1 Where condi1=1

解析后的SQL为

select

c1,

c2,

c3

from

t1

where

condi1=1

原SQL为select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

解析后的SQL为

select

c1,

c2,

c3

from

t1,

t2

where

condi3=3 or

condi4=5

order by

o1,

o2

原SQL为Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2

解析后的SQL为

select

c1,

c2,

c3

from

t1,

t2

where

condi3=3 or

condi4=5

order by

o1,

o2

原SQL为select c1,c2,c3 from t1,t2,t3 wher >

用 Oracle Database 10g 使用正规表达式

您可以使用最新引进的 Oracle SQL REGEXP_LIKE *** 作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE *** 作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上,它们类似于已有的 *** 作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。

正规表达式的基本例子

在使用这个新功能之前,您需要了解一些元字符的含义。句号 () 匹配一个正规表达式中的任意字符(除了换行符)。例如,正规表达式 ab 匹配的字符串中首先包含字母 a,接着是其它任意单个字符(除了换行符),再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始,而美元符号 ($) 指示一行的结尾(参见表1:附表见第4页)。因此, 正规表达式 ^ab$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE *** 作符提供的类似的模式匹配 a_b 相比较,其中 (_) 是单字符通配符。

默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复 *** 作符。如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^ab$。 元字符重复前面的元字符 () 指示的匹配零次、一次或更多次。LIKE *** 作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次。

表 2 给出了重复 *** 作符的完整列表。注意它包含了特殊的重复选项,它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。例如,正规表达式 b(an)a 匹配 ba、bana、banana、yourbananasplit 等。仅供参考!

以上就是关于mysql字符串怎么完全正则匹配,用regexp全部的内容,包括:mysql字符串怎么完全正则匹配,用regexp、sql正则表达式常用符号、利用sql 写一个正则表达式 判断 是否为手机号码 11 位 + 数字... 变量@TelNo等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9345001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存