1.什么是正则表达式
正则表达式由英文词组“regular expression”翻译而来,可以理解为是对文字进行模糊匹配的一种语言。
用一些特殊的字符(元字符)来表述文字应该具有某种特征。
2.元字符的定义
正则表达式中有特殊含义的字符,用于描述文字的特征。
例如“?”表示的是其前面的字符是可有可无的,比如abc?说明字符“c”是可有可无的,可以匹配abc和ab。
3.子匹配
正则表达式中用圆括号括起来的部分被称之为子匹配,子匹配还可以被再次地引用。
1代表第一个子匹配,2代表第二个子匹配。
例如,2个相同的任意数字可以用(d)1来表示,任意5个相同的数字可以用(d)1{4}匹配。
1221,3553可以用(d)(d)21来表示匹配关系。
4.正则表达式的作用
4.1.检查文字是否匹配某个模式,例如检查文字是否是正确的Email格式,发表的言论中是否有不合法的关键词等。
4.2.对文字中符合模式的字段做批量的修改。
例如使用load data local infile “c:/data.txt” into table person(name,age,salary);语句可以将文件c:/data.txt导入到MySQL数据库person表中。
load data local infile默认使用tab键来分隔不同字段的值,也就是要求c:/data.txt中的数据应该是如下的格式:
zhangsan 21 6000
lisi 20 5000
...
当然也可以用指定的字符来代替tab键,比如用“,”来代替,load data local infile “c:/data.txt” into table person(name,age,city,salary) FIELDS TERMINATED BY ',';
c:/data.txt中的数据应该是如下的格式:
zhangsan,21,6000
lisi,20,5000
...
现在假设文件中数据格式不是很规范,如下:
zhangsan 21 6000
lisi 20 5000
...
我们想把上面文件中数据字段间的间隔改为“,”,就可以使用正则表达式来完成。
将 +(d+) +替换为,1,即可。 +(d+) +指的是:任意位数空格加上任意位数数字加上任意位数空格。
4.3.精确的查找文本中符合某种模式的字段。
希望给一份通讯录中的所有人群发邮件,需要从下面的文件中提取出所有的邮箱地址
"batcompany","zhangsan","zhangsan@batcompany.com"
"batcompany","lisi","lisi@gmail.com"
...
将^.+"(.+@.+..+)"$替换为1,即可。
^代表一行的开始,$代表一行的结束。+表示任意位数。
.匹配任意的字符,要匹配email地址中的”.“时需要做转义,可以看到上面的匹配规则中用到了.。
5.正则表达式语法
正则表达式中的元字符可以分为以下几类:
限定符
选择匹配符
分组组合和反向引用符
特殊字符
字符匹配符
定位符
5.1限定符
限定符用于描述前面的字符或者组合项连续出现多少次。
{n},至少出现n次,例如”food“就不匹配o{2}。n是大于等于0的整数。
{n,},至少出现n次,最多没有限制。
{n,m},至少出现n次,最多出现m次。
+,至少出现一次,例如”zoo“可以匹配zo+。+和{1,}的作用是相等的。
*,出现0次或者出现多次,例如”z“可以匹配zo*。*和{0,}作用相等。
?,出现0次或者一次,例如”abc“和”ab“都匹配abc?。?和{0,1}作用相等。
贪婪匹配与非贪婪匹配
贪婪匹配
正则表达式默认的是贪婪匹配,例如将”zoom“中匹配”zo*“的部分替换为”r”,替换后的结果是“rm”,而不是“room”或者“rom”。
非贪婪匹配
当“?”跟在其它的限定符之后时,应用的就是非贪婪匹配。例如“foood”匹配fo+?换为“r“,替换后的结果是”rood“。
5.2选择匹配符
只有一个”|“,用于匹配左右2个选项中的一个。
例如希望匹配”chapter 1“或者”section 1“,可以使用(?:chapter|section) 1而不是chapter|section 1。这里在匹配时用到了?:,是因为不希望把(?:chapter|section)作为一个子匹配,也就不会被其它的地方所引用。
5.3分组组合和反向引用符
分组组合和反向引用符就是子匹配及子匹配的引用。
例如,d{5}表示5个连续的数字,(d)1{4}表示5个连续的数字。
需要注意的是,由于”(“和”)“在子匹配中使用,需要匹配字符串中的”(“和”)“就需要转义,写为”(“和”)“。
(?:chapter|section) 1 (d)1{4},由于使用了?:,”1“将指的是(d)。
(?=pattern),正向预测先行匹配,windows (?= NT|2000)将会匹配”windows NT“或者”windows 2000“中的”windows“,而不会匹配”windows 2003“中的”windows“。
(?!pattern),反向预测先行匹配,与上面的作用相反。
需要注意的是:正向预测先行匹配和反向预测先行匹配只能位于一个正则表达式的最前边或者最后边。例如:“My windows NT sierial”可以使用“ (?= NT|2000) sierial”或者“windows (?= NT|2000)”匹配,而不能使用“windows (?= NT|2000) sierial”匹配。
5.4特殊字符
5.5字符匹配符
字符匹配符用于匹配多个字符中的任意一个。
[...],匹配其中的一个,例如“abcde”匹配[a,c]的结果就是ac。如果需要匹配“]”,则需要写成[]...]的形式,如果需要匹配"",则需要写成[...\...]的形式。
[^...],和上面的作用相反,不匹配其中的任意一个。
[a-z],匹配a到z中的任意一个,例如[a-z]可以匹配所有的小写字母,[0-9]可以匹配0到9间的任意一位数。[a-z]表示匹配“a”,“-”和“z”三个字母中的一个。[-a-z]和[a-z-]表示匹配小写字母和“-”字符。
[^a-z],和上面的作用相反。
d,相当于[0-9]
D,和上面的作用相反。
s,匹配任意的空白,等价于[ f v]
S,和上面的作用相反。
w,匹配任意字母数字和下划线,等价于[A-Za-z0-9_]
W,和上面的作用相反。
.,用于匹配除了换行( )之外的任意字符。
匹配任意的字符可以使用[sS]、[dD]、[wW]。