什么鬼是正则表达式
其实它就是字符串,只不过它不是一般的字符串,而是用来定义字符串的模式,
比如我们常用的格式化时间的函数:SimpleDateFormat(String pattern),里面传入的就是一个正则表达式,比如:“YYYY-MM-DD”,这里就是规定了时间是这样子显示,如果匹配不成功就说明这个不是时间的字符串
正则表达式可以用来搜索,编辑或者处理文本,网络爬虫等等,很多语言都可以用,区别不大.
正则表达式的语法
普通字符
字母,数字,汉字,下划线以及没有特殊定义的标点符号都是普通字符.在正则表达式里面,普通字符在匹配一个字符串的时候匹配的是以之相同的一个字符
例如:
正则表达式:“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之外的任意一个字符 |
注意一下:
- 正则表达式的特殊符号,如果放在中括号中,就会失去特殊的意义,除了^ 和-,因为他们两个本来就是特殊意义,比如[d]这里面的d就是d本身自己
- 对于标准字符集合,除了小数点,如果在括号中,自定义字符集合就会包含该集合,比如:
[\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的意思 |
() 捕获组 | 作用有两个:①在被修饰匹配次数的时候,括号的表达式可以作为一个整体被修饰 ②:就是反向引用,下面有写 |
(?:表达式) | 非捕获组,比如在一些表达式里面不得不使用括号,但是又不需要保存()中的表达式匹配到的内容,这时就可以利用非捕获组来消除()带来的副作用 |
预搜索(或零宽断言或环视)
这里是匹配某个位置的前面或者后面是否符合某一种格式,但是这种格式是不算入匹配的结果的,它的语法格式有:
(?=expression) | 断言位置出现的位置后面要符合表达式expression,但是断言后面的expression不算入匹配结果 |
(?!expression) | 断言位置出现的位置后面不能有表达式expression符合的结果 |
(?<=expression) | 断言位置出现的位置前面要符合表达式expression |
(?<!expression | 断言位置出现的位置前面不能符合表达式expression |
占字符:正则表达式匹配的过程中,如果子表达式匹配的是字符内容,而不是位置,并被保存到最终的匹配结果中,那么认为这个子表达式是占有字符的
零宽度:如果子表达式匹配的仅仅是位置,或者匹配的内容不保存到最周的匹配结果中,那么这个子表达式是零宽度的.
占有字符还是零宽度,是针对匹配的内容是否保存到最终得匹配结果来说的