正则表达式:

1、背景:
正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式;如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式;如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。
2、作用:
匹配文本,将一个模式(正则表达式)与一个文本串进行比较。mysql用where子句对正则表达式提供了初步的支持,允许你指定正则表达式过滤select检索出的数据。

2.1规则:

 

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\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 次。

 

3、例子:
3.1

select prod_name
from products
where prod_name regexp'1000|2000'
order by prod_name;

select * from XXX  where dt='20201118' and scztmc REGEXP '浙江大华机器人技术有限公司|杭州泛普生物科技有限公司';
3.2
为了匹配特殊字符,必须使用\\为前导。
\\- 表示查找-, \\. 表示查找. 。

select vend_name
from vendors
where vend_name regexp '\\.'
order by vend_name;

3.3

select prod_name
from products
where prod_name regexp '[[:digit:]]{4}'
order by prod_name;


如前所述,[:digit:]匹配任意数字,因而为数字的一个集合。
{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
3.4
定位符:
上面的所有例子都是匹配一个串中任意位置的文本。为了匹配特殊位置的文本,可使用如下定位符。
^ 文本的开始
$ 文本的结尾

select prod_name
from products
where prod_name regexp '^[0-9\\.]'
order by prod_name;


这个是找出一个数(包括以小数点开始的数)开始的所有产品。

3、简单的正则表达式测试:
可以在不使用数据库表的情况下用select来测试正则表达式。
regexp检查总是返回0(没有匹配)或1(匹配)
例如:select 'hello' regexp '[0-9]';
这个例子显然将返回0(因为文本hello中没有数字)。