正则表达式的简介和正则表达式的语法

什么鬼是正则表达式

其实它就是字符串,只不过它不是一般的字符串,而是用来定义字符串的模式,
比如我们常用的格式化时间的函数:SimpleDateFormat(String pattern),里面传入的就是一个正则表达式,比如:“YYYY-MM-DD”,这里就是规定了时间是这样子显示,如果匹配不成功就说明这个不是时间的字符串
正则表达式可以用来搜索,编辑或者处理文本,网络爬虫等等,很多语言都可以用,区别不大.

正则表达式的语法

普通字符
字母,数字,汉字,下划线以及没有特殊定义的标点符号都是普通字符.在正则表达式里面,普通字符在匹配一个字符串的时候匹配的是以之相同的一个字符
例如:
正则表达式:“jane”
字符串:“https://editor.csdn.net/md?articleId=104345644,jane”
这样子就会匹配到最后面的jane
转义字符

\n 换行的意思
\t 就是一个tab键的意思
\ \ \自己
\ ^,\ $,\ .,\ (,\ ),\ {,\ },\ ?,\ +,\ *,\ [,\ ] ,(还有斜杠| 这些都是代表自己本身

标准字符集合
这个能和多种字符匹配,注意区分大小写的,大写就是相反的意思

\ d 匹配0-9中的任意的一个数字都行
\ w 任意一个字母或者数字或者下划线都可以匹配,就是A-Z,a-z,0-9,_
\ s 空格,tab键,换行符等空白符
. 这是小数点,可以匹配任意字符,除了换行符,如果要匹配所有字符包括换行符,一般是[/ s/S],因为括号里面是或的意思

自定义字符集合
就是方括号匹配方式,能匹配方括号里面的任意一个字符,例如:

[sa#] 匹配s或a或#中任意的一个都行
[ ^sa#] 匹配除了s,a和#之外的所有字符
[a-z] 匹配a到z之间的任意一个字符
[ ^a-z0-9] 匹配a到z0到9之外的任意一个字符

注意一下:

  1. 正则表达式的特殊符号,如果放在中括号中,就会失去特殊的意义,除了^ 和-,因为他们两个本来就是特殊意义,比如[d]这里面的d就是d本身自己
  2. 对于标准字符集合,除了小数点,如果在括号中,自定义字符集合就会包含该集合,比如:
    [\d-.]将会匹配数字,-和小数点

量词
修饰匹配次数的符号

{n} 表示{n}前面的一个表达式重复多少次,例如\d{8},意思就是查找八位数字的字符,注意一下,\d\d{8}不是查找16位的意思,{8}只对前面的/d有效,如果要表示16位,就得用括号括起来,(\d\d){8}
{m,n} 表示最少重复m次,最多n次
{m,} 就是最少m,最多无限, 不存在这样子写的{,m},你可以写成{0,m}
? 出现0次或者1次,相当于{0,1}
+ 最少出现一次,相当于{1,}
* 不出现或者出现任意多次,相当于{0,}

这里注意一下:
比如上面的匹配{m,n},匹配m到n次,比如{3,8},这里如果匹配八位了,那么八位里面的三位到底还要不要匹配,这里就涉及匹配次数的模式:贪婪模式和非贪婪模式,
贪婪模式:就是匹配的数字越多越好,默认是这个
非贪婪模式:匹配的字符越少越好,如果要将模式改成这个,就在{}或?或+或*后面加上一个?

字符边界
字符边界匹配的是字符位置,是零宽度的,指的是符合某一种条件的位置

^ 匹配字符串开始的地方,注意这个是[]外面的^,已经不是取反的意思了,例如: ^ j,就是一个以j开头的字符串
$ 字符串结束的地方,j$就是以j结束的字符串
\ b 匹配一个单词的边界,就是\ b这个位置是前面的字符和后面的字符不全是 \ w,就是前面后后面都不是字母,数字,或下划线

匹配模式

ignorecase 忽略大小写模式,默认是严格区分大小写的
singleline 单行模式,整个文本看作一个字符串,只有一个开头和一个结尾,这个模式使用小数点可以匹配包括换行符在内的任意字符
multiline 多行模式,每一行都是一个字符串,都有开头和结尾,这个模式如果要匹配整个文本最最最开始和最最最结束位置,可以使用\ A和\ Z

选择符和分组

| 表达式左右两边之间的或的关系,比如:jane|jian,就是匹配jane或jian的意思
() 捕获组 作用有两个:①在被修饰匹配次数的时候,括号的表达式可以作为一个整体被修饰 ②:就是反向引用,下面有写
(?:表达式) 非捕获组,比如在一些表达式里面不得不使用括号,但是又不需要保存()中的表达式匹配到的内容,这时就可以利用非捕获组来消除()带来的副作用
反向引用:\nnn
这里的n是一个数字,每一对()会被分配一个括号,
每一个括号的顺序从1开始算起,以左括号为标准,
左括号在左括号里面排行第几,它被分配的数字就是几,
通过这里的反向引用,可以对括号里面已经捕获的内容进行再次使用
比如文本:janedalsd janejane jianjian jianfdks
正则表达式:([a-z]{4})\1
解释:这里是想找四个字母的单词出现了两次的,
[a-z]{4}这个是找出四个字母的单词,
然后这个括号就是就是将括号里面的东西进行分组,
因为只有一个括号,所以分组是1,同时也要将括号匹配到的内容存起来,
后面的\1就是反向引用,因为分组只有一个,1,想引用第一个分组,所以就\1,
如果想引用第三个或者第四个,就是\3或\4

再例子解释一下编号的问题,
如果括号这样:(1)(2)(3)
/1代表(1),/2代表(2),/3代表(3)
如果括号这样:(1(2)(3)1)(4)
/1代表(1),/2代表(2),/3代表(3),/4代表(4)

预搜索(或零宽断言或环视)
这里是匹配某个位置的前面或者后面是否符合某一种格式,但是这种格式是不算入匹配的结果的,它的语法格式有:

(?=expression) 断言位置出现的位置后面要符合表达式expression,但是断言后面的expression不算入匹配结果
(?!expression) 断言位置出现的位置后面不能有表达式expression符合的结果
(?<=expression) 断言位置出现的位置前面要符合表达式expression
(?<!expression 断言位置出现的位置前面不能符合表达式expression
比如现在要匹配以ed结尾的单词
字符串:janed jianed happy fun
表达式:[a-z]+(?=ed)
解释:这里就是匹配到jane和jian,表达式匹配的是前面是任何的字符,
但是后面的零宽断言出现后,位置后面必须是ed,所以就只有jane和jian符合,
注意匹配结果是不包括ed的

占字符:正则表达式匹配的过程中,如果子表达式匹配的是字符内容,而不是位置,并被保存到最终的匹配结果中,那么认为这个子表达式是占有字符的
零宽度:如果子表达式匹配的仅仅是位置,或者匹配的内容不保存到最周的匹配结果中,那么这个子表达式是零宽度的.
占有字符还是零宽度,是针对匹配的内容是否保存到最终得匹配结果来说的

发布了133 篇原创文章 · 获赞 37 · 访问量 4734

猜你喜欢

转载自blog.csdn.net/qq_43416157/article/details/104345644