Table of Contents
正则表达式入门
-
概念
- 正则表达式(Regular Expression),实际上也叫规则表达式,它本质上是一个字符串为什么叫正则 表达式,可能第一个翻译的人觉得这样更好听吧。正则表达式是一个语言规则,就像编程语言的面向对象这个特性一样,不同的语言它的实现不一样,但是都有共同的特点,有继承,多态等等,更像是网络协议,他只是一个标准。
-
它就类似数学表达式,比如” {x|x<10,x>0}” ,这个字符串,代表一个大小为0-10的数字。其实这就是正则表达式,只不过正则表达式采用和数学表达式不同的字符,和不同的字符组合规则,前面这句字符串用正则表达式来表达就是”[0-10]”,代表相同的意思:一个大小在0-10之间的数字。
正则表达式称为一个模式-pattern,它不仅仅可以表示一个数字,还可以表示一个字符,两个字符,一个字符串等。比如pattern1这个模式,可以代表这个意思,”一个首字母为a,a的后面可以跟任意个字符,匹配任意个字符后,最后一个字符为b“,我可以给出”afffb”,”alkjb”,”assssb”这三个字符串,他们都是符合模式的意义的,这个pattern1模式的实际正则表达式为“^a.*?b$”。
- 正则表达式的作用是,解决这样的问题,从一个字符数量很长,甚至包含上万个字符串找出其中某段符合一个正则表达式模式的子字符串。这个被找的字符串一定具有某些特殊的格式,比如让你找一本书的章节字符串,这个字符串的特点是什么?他一般是这个模样:”章节n”,由章节两个字,加上一个数字,章节1,章节2等等等,用一个正则表达式来表达就是“^章节/d$”。如果让匹配的字符串不具备某些特殊的格式那么这种匹配是无法进行,也是没有很多意义的。
-
语法
- 如果你理解了上面的概念,那么你应该知道正则表达式,首先它本质上是一个字符串,其次它是用来匹配字符串的。这个字符的组成包括两个部分:普通字符+特殊字符,特殊字符也叫元字符(诸如^,*,?这样的字符),。一个模式,还可以包括子模式,子模式用“(pattern)”圈出。也可以说一个正则表达式是由组多个子模式组成的。
-
普通字符
是什么:普通字符好理解,就是普通可打印(字母数字下划线),不可打印字符,\n \r 诸如换行,回车这样的字符。
作用是:如果正则表达式的字符串出现一个普通字符,就说明,这个位置一定要匹配一个一模一样的字符,比如”^a.*?$”,虽然你现在只知道a这个普通字母的含义,因为还没讲特殊字符,但是它的位置你可以看出,它在. * ?这个字符串的前面,所以这个普通字符的含义是:在. * ?的前面一定会匹配一个字符a
-
特殊字符
特殊字符很多,我只介绍最重要的几类,全部的特殊字符及其作用可以在维基百科搜索到。
- 数量限定类
用法:这类字符是修饰字符,放在需要修饰的字符后面,只能修饰一个字符。含义是规定这个被修饰的字符可以连续出现的次数。会限制最多匹配连续的几个字符,加了修饰后,模式会尽可能地匹配符合这个pattern连续出现字符次数最多的字符串。如果在数量限定修饰符后面加一个字符“?”就会使该pattern尽可能地匹配该字符连续出现次数最少的字符串。这就是贪心和非贪心匹配
字符 含义 {n} n为数字,表示被修饰的字符至少要出现n次 {n,} 表示被修饰的字符至少要出现n次 {n,m} 表示出现的字符数量在n-m之间,但是由于本身是贪心的,所以会优先匹配数量为m的 + 表示匹配一次或者多次,等于{1,} * 表示修饰的字符可以匹配0次或者多次 ? 1. 非贪心量化,修饰其他数量限定符,使其变得不贪心。2. 修饰普通字符,代表匹配0或者1次 例子:pattern=“a+b”,这个模式可以匹配上 “ab”,“aaab”,都可以如果一个字符串包括“ab aaab”两个子串,他会优先匹配第二个子串aaab。
- 定位类符
用法:这种字符不是修饰符,而是位置判定符,一个字符代表某个特殊的位置,这种特殊位置由四个,字符串开始处,字符串结束处,单词开始处,单词结束处。需要注意的是,一个位置在这里意义等同于一个字符。
字符 含义 ^ 表示字符串的开始处(换行符的后面) $ 字符串的结尾处(换行符的前面) \b 单词的开始处, \B 单词的结尾处 例子:pattern=”^a+b$”,给出一个需要匹配的字符串“adaaaabs \n aaaab \n sdsf”那么这个模式会匹配中间那个字符串aaaab,而不会匹配第一个字符串中的aaaab子串,因为第一个字符串的子串中aaaab的第一个a的前面没有字符串开始位置,”^符号需要匹配一个开始位置,而第二个前面有一个换行符\n,所以这里具备开始位置,同理$字符匹配也是这样。
- 匹配类符
用法:这类符就是“()”小括号中间为一个子模式,一个模式中可以含有任意多个子模式,实际匹配中,可以当作小括号不存在。子模式存在的意义是,可以被向后引用和作为匹配结果返回。可以作为匹配结果返回的意思是,这个模式匹配完后,会把()内子模式匹配的这一部分单独提取出来作为匹配结果返回,向后引用意思是,匹配结果可以作为模式条件写在模式之中。一个模式可能具有许多个子模式,每一个子模式都会产生一个匹配结果,可以以子模式在整个模式中从左到右的顺序来引用,格式为:\n,的值是从1开始的整数 \1 表示引用第一个子模式的引用,\2表示引用第二个子模式。
例子:pattern=“^a+(s+)d(f+)\1\2$ “,它可以匹配一个字符串为“aaassdfssf”,^和$就不说了,a+表示匹配至少1个的连续个a,s+,f+也是同理,d是普通字符且没有修饰符,表示单独匹配一个字符d,\1表示引用前面的第一个子串s+,匹配一个和s+一样的子串,也就是ss,\2引用第二个子模式,匹配一个f。
- 数量限定类
-
- 如果你理解了上面的概念,那么你应该知道正则表达式,首先它本质上是一个字符串,其次它是用来匹配字符串的。这个字符的组成包括两个部分:普通字符+特殊字符,特殊字符也叫元字符(诸如^,*,?这样的字符),。一个模式,还可以包括子模式,子模式用“(pattern)”圈出。也可以说一个正则表达式是由组多个子模式组成的。
-
总结
以上就是正则表达式,最重要的内容,掌握了这些,基本对正则表达式就有了基本清晰的概念,剩余的元字符就自己搜着学咯。
评论前必须登录!
注册