正则表达式30分钟入门教程:deerchao.net/tutorials/regex/regex.htm
下面的内容感觉看着不顺眼,还是去看菜鸟教程里面的教程,感觉写的很完善,很适合我这种初学者。
表1.常用的元字符
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
w | 匹配字母或数字或下划线或汉字(匹配不了汉字,需要用
[u4e00-u9fa5]进行匹配
) |
s | 匹配任意的空白符 |
d | 匹配数字 |
匹配单词的开始或结束 | |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
表2.常用的限定符(例2)
代码/语法 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? |
重复零次或一次(针对的是排在他前面的那串-可能是一个字符也可能是[ab]一组数) 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
{n} | 重复n次,n虽然可以等于0但是没有意义 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次,m>=n,n>=0 |
想要查找“*”,“+”,“”这种元字符本身,需要进行转义即在前面加个“”
[.?!]匹配标点符号(.或?或!)在中括号中,不需要转义
“[]”中括号里面可以随便放需要匹配的对象,查找的时候,只要在里面存在的就是符合的
表3.常用的反义代码
代码/语法 | 说明 |
W | 匹配任意不是字母,数字,下划线,汉字的字符 |
S | 匹配任意不是空白符的字符 |
D | 匹配任意非数字的字符 |
B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符==这个x可以换成任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
表4.常用分组语法,这个感觉好难
分类 | 代码/语法 | 说明 |
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)这个不晓得为什么,尝试了一下,用不了╮(︶﹏︶")╭,我猜是过期了 | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置这个不晓得为什么,尝试了一下,用不了╮(︶﹏︶")╭,我猜是过期了 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置这个不晓得为什么,尝试了一下,用不了╮(︶﹏︶")╭,我猜是过期了 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读。这个不晓得为什么,尝试了一下,用不了╮(︶﹏︶")╭ |
“(",")”在正则中也是特殊的字符,用来指定子表达式的(也叫做分组)(例1)
这里有些复杂的地方:
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
- 分组0对应整个正则表达式
- 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
- 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.
后向引用用于重复搜索前面某个分组匹配的文本。例如,1代表分组1匹配的文本。难以理解?请看示例:(例3)
(w+)s+1可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字((w+)),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(1)。
你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>w+)(或者把尖括号换成'也行:(?'Word'w+)),这样就把w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用k<Word>,所以上一个例子也可以写成这样:(?<Word>w+)s+k<Word>。这个写法不知道为什么我试了并没有用
例1:(d{1,3}.){3}d{1,3}
分解:
第一步:()括号中的对象 FirstObj: d{1,3}.=》d{1,3}表示必须选择1-3个数字,.转义字符“.”,就是后面再缀个"."必填,像“1.”,"22."都是匹配的
第二步:SecondObj:(FirstObj)用括号括起来后,这就是一个整体了
SecondObj{3}就是整个对象进行重复三次操作。相当于FirstObjFirstObjFirstObj( d{1,3}. d{1,3}. d{1,3}.)
第三步:剩下的d{1,3}就是后面放个1-3个数字
像1.1.1.1这种就是匹配的
例2: 2[0-4]d|25[0-5]|[01]?dd?
分解:
2[0-4]d=》 第一位2,第二位0-4之间的数字(包含)必选一个,第三位数字
25[0-5]=》前两位25,第三位在0-5之间的数字必选一个
[01]?dd?=》第一位0和1选一个值,可选可不选,第二位必选一个数字,第三位数字可选可不选
例3:(w+)s+1
分解:
第一步:(w+)单看这一句,就是单词检索
第二步:s+即1-n个空格
第三步:1这个放在这里就相当于拿到第一步中匹配到的对象放到这个位置进行全匹配
举个例子(空格用红色的“~”代替,好认一些):
1.ab~~cdab 结果:没有匹配,匹配流程:第一步中获取到ab,然后1就变为了ab,即当前的正则表达式就变成了abs+ab 那么继续匹配则是找不到符合的对象的
2.abc~~abcd 结果:没有匹配,匹配流程:第一步中获取到ab,然后1就变为了abc,即当前的正则表达式就变成了abcs+abc 由于后面还需要单词结束,即需要是整单词匹配,不符号要求
3.abcd~~abcd xe 结果:abcd~~abcd 匹配成功。
4.ab~~abc~~abc ab 结果:abc~~abc 匹配成功,匹配流程:第一步中获取到ab可惜找不到匹配的对象,那么只能继续找到第二个单词abc,此时找到了。当然还会继续下去找第三个单词,可惜第三个单词后面的字符串并不符合
5.ab~~abc~~abc~~abc 结果:abc~~abc
6.ab~~abc~~abc~~abc~~abc 结果:第一个:abc~~abc,第二个:abc~~abc
例4:(d([a-z]+))s2 分组是从左边开始往右依次加1,第一个括号匹配的就是第一组,第二个就是第二组,而不是计算法则中先里后外
1abc abc 3a ax
结果:共找到 2 处匹配:
1abc abc
3a a
1abc abc
3a a
例5:(d([a-z]+)?)s2 第二组加了?,则可有可无
1 1abc 3a ax
结果:共找到 2 处匹配:
1
3a a
1
3a a