正则表达式是一种用来描述字符串模式的工具,它可以用于匹配、查找、替换等操作。正则表达式由字符和特殊字符组成,可以使用这些字符来定义匹配规则。
常用的正则表达式字符和特殊字符有:
a
表示匹配字母"a"。.
表示匹配除换行符以外的任意字符。[]
表示,表示匹配括号内的任意一个字符,如 [abc]
表示匹配字符"a"、“b"或"c”。[^]
表示,表示匹配除括号内字符以外的任意字符,如 [^abc]
表示匹配除"a"、“b”、"c"以外的任意字符。*
、+
、?
表示,分别表示匹配前一个字符0次或多次、1次或多次、0次或1次。^
、$
表示,分别表示匹配字符串的开头和结尾。()
表示,可以将多个字符组合为一个整体,如(ab)+
表示匹配"ab"、“abab”、"ababab"等。\
表示,可以将特殊字符转义为普通字符,如.表示匹配字符"."。match()
函数可以在字符串中查找匹配正则表达式的部分,并返回一个包含匹配结果的数组。search()
函数可以在字符串中查找匹配正则表达式的部分,并返回第一个匹配的位置。replace()
函数可以将字符串中匹配正则表达式的部分替换为指定的内容。split()
函数可以根据正则表达式将字符串分割为多个部分,并返回一个数组。用来指定前面的字符或字符类的重复次数。
常用的量词有:
*
:匹配前一个字符0次或多次。
+
:匹配前一个字符1次或多次。
?
:匹配前一个字符0次或1次。
{n}
:匹配前一个字符恰好n次。
{n,}
:匹配前一个字符至少n次。
{n,m}
:匹配前一个字符至少n次,最多m次。
.
:匹配除换行符以外的任意字符。\d
:匹配数字字符。\D
:匹配非数字字符。\w
:匹配字母、数字、下划线字符。\W
:匹配非字母、数字、下划线字符。\s
:匹配空白字符(空格、制表符、换行符等)。\S
:匹配非空白字符。\b
:匹配单词边界。\B
:匹配非单词边界。()
:将多个字符组合为一个整体。
(?:)
:非捕获分组,用于只匹配但不捕获。
\1
、\2
、…:引用前面的分组,用于匹配相同的内容。
(?=...)
:正向肯定前瞻,用于匹配满足某个条件的位置。(?!...)
:正向否定前瞻,用于匹配不满足某个条件的位置。(?<=...)
:反向肯定后顾,用于匹配位于某个条件之后的位置。(?:反向否定后顾,用于匹配不位于某个条件之后的位置。
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
. | 匹配除“\n”之外 的任何单个 字符 |
[…] | 字符集合 。匹配所包含 的任意一个字符 。例如,‘[abc]’可以匹配“plain”中的‘a’。 |
[^…] | 负值字符集合 。匹配未包含 的任意字符 。例如,‘[^abc]’可以匹配“plain”中的‘p’。 |
p1|p2|p3 | 匹配p1或p2或p3。例如,‘z|food’能匹配“z”或“food”。‘(z|f)ood’则匹配“zood”或“food”。 |
模式 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次 。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次 。例如,‘zo+’能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
{n} | n是一个非负整数 。匹配稳定的n次 。例如,‘o{2}’不能匹配“Bob”中的‘o’,但是能匹配“food”中的两个o。 |
{n,m} | m和n均为非负整数 ,其中n<=m。最少匹配n次且最多匹配m次 。 |
正则表达式的用法非常灵活,可以根据具体的需求来选择合适的字符、特殊字符、量词、分组等来构建匹配规则。同时,正则表达式还支持一些高级的特性,如贪婪模式、非贪婪模式、修饰符等,可以进一步扩展正则表达式的功能。
正则表达式的详细用法还有很多,可以根据具体的需求来选择合适的正则表达式和相应的函数来进行操作。
代码如下(示例):
-- ^ 在字符串开始处进行匹配
SELECT 'abc' REGEXP '^a';
-- $ 在字符串末尾开始匹配
SELECT 'abc' REGEXP 'a$';
SELECT 'abc' REGEXP 'c$’;
-- . 匹配任意字符
SELECT 'abc' REGEXP '.b';
SELECT 'abc' REGEXP '.c';
SELECT 'abc' REGEXP 'a.';
-- [...] 匹配括号内的任意单个字符
SELECT 'abc' REGEXP '[xyz]';
SELECT 'abc' REGEXP '[xaz]';
代码如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]';
-- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*';
-- a+ 匹配 1 个或者多个 a, 但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
代码如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]';
-- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*';
-- a+ 匹配 1 个或者多个 a, 但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
-- a{m,n} 匹配 m 到 n 个 a, 包含 m 和 n
SELECT 'auuuuc' REGEXP 'au{3,5}c';
SELECT 'auuuuc' REGEXP 'au{4,5}c';
SELECT 'auuuuc' REGEXP 'au{5,10}c';
-- (abc) abc 作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符
作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y';
SELECT 'xababy' REGEXP 'x(ab)*y';
SELECT 'xababy' REGEXP 'x(ab){1,2}y';
create_table stb00 as
select * from test01
;
create_table stb01 as
select col_02,col_03 from stb00
where col_03<>'应用程序版本号'
and length(col_03)=12
;
--col_03匹配格式为xx-xx-xxxxxx x代表16进制字符(包括大小写)
create_table stb02 as
select
col_02,
col_03,
col_03 REGEXP '(^[0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][\.][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][\.][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF]$)'
from
stb01
;
select * from stb02
limit 100000;