什么是正则表达式
首先 正则表达式 是一个字符串
这是一个什么字符串呢? 一个描述 特定字符串 的 字符串
先来上两个正则
兼容老旧的15位身份证 和现代18位身份证的正则:
单纯的正则:
^\d{15}(?:\d{3}|\d{2}[xX])?$
java版:
中国人名字的匹配,可以匹配新疆人名带点得名字的正则:
单纯的正则:
^[\u4e00-\u9fa5]+(?:[.·.•][\u4e00-\u9fa5]+)*$
java版:
这里出来两个长得很像的表达式是相同的效果,文章的结尾会说明为什么会这样。
1. 正则的组成
元字符
表达式本身的保留字符 好比java中得保留字if
如[] + * \ ?
字符组
字符组 是表示一个字符。
仔细阅读下上一行没有看错 ,一个组表示一个字符,组中的内容只是为了描述这个字符的所有可能性。
如:[as0-9] ,这就表示一个字符 ,这个字符可以是a s 0 1 2 3 4 5 6 7 8 9 中得任意一个。
字符组的特殊用法
[-0-9] - 在字符组中有 A to B 表示范围的意思 放在首位就只是普通的 -
[^0-9] ^在字符组的最开始 表示 非!
阅读时只需要假装看不见^,看后面的内容,最后
的意思就是除去后面的内容,为这个字符的可能的所有情况。
[*.?+] 大部分原字符被丢进字符组后 就不在是保留字了
他是什么就是什么,相当于转义。很明显正则使用的时候
使用正则字符串作为规则,去匹配目标字符串,如果目标字符串
中含有正则中得元字符,我们就必须转义。( \+ ,这样也
是可以让元字符丧失保留字意义)
普通字符
除了元字符以外的字符,当然有时候 一个字符是不是元字符,取决于他在字符组里还是字符组外面。
2. 量词
ba{6,8}
表示b字符后面有紧跟6~8个a,量词{6,8}是修饰紧贴在他前面的a
如果你要修饰ba 就要写成(ba){6,8}
?相当于 {0,1} 出现0次或1次
+相当于 {1,} 出现1次到任意多次(逗号后面啥不写表无穷)
*相当于{0,} 出现0次到任意多次
{9}相当于{9,9}
3. 元字符的意思 以及 几个转义
| 或
{}是用来包住量词的
[]是用来表示字符组的
?+*请看量词的意思
.表示任意字符(当然只有他是元字符的时候是这样,因为[.]时他就只是个.)
\s表示空白符(有哪些请百度)
\d表示0~9(digital)
\w表示0~9和a~z和A~Z(word)
\S表示除了\s以外的字符可能
\D和\W同理(如果同理不出,请关闭此页)
^表示行首,[^chun]字符组中放在首位 表示非
$在单行模式下表示行尾
4. 关于贪婪
正则表达式:".*"
目标串:"why"amI"stupid"
匹配结果 "why"amI"stupid"
正则表达式:"[^"]"
目标串:"why"amI"stupid"
匹配结果 "why" 和 "stupid"
第一个表达式为什么会匹配整个目标串呢,因为正则是一个贪婪的孩子,他会继续向后尝试,能匹配越长越好。
正则表达式:(holy){1,2}
目标串:holyholyholy
匹配结果 holyholy holy
使正则变的不贪婪的一种方式,在量词后紧紧贴着? 使以下正则在匹配到1后就不会去尝试2
正则表达式:(holy){1,2}?
目标串:holyholyholy
匹配结果 holy holy holy
上面是匹配了三段
结尾
中国人名字的匹配,可以匹配新疆人名带点得名字的正则:
^[\\u4e00-\\u9fa5]+(?:[.·.•][\\u4e00-\\u9fa5]+)*$
java版:
java版的两个正则为什么长得不一样效果却相同
首先要明白在java的字符串中\是一个保留字符 他是用来做转义的。
“\ \”在java中其实就是 打出一个\
java的字符串 刚巧提供了\uXXXX 的转义unicode的功能
更巧的是 正则表达式也提供了\uXXXX转义unicode的功能
所以
第一个图片的正则是 java字符串对unicode进行了转义
第二个图片的正则只是用了java“\ \“的这个转义 把\uXXXX交给了正则表达式
大约写到这里能记录下初探的目的了,关于正则的环视,和正则NFA实现以及它的效率,以后有时间还会记录一下 。