学习正则表达式
正则表达式这一章节,其实不太好分类,因为他是一种工具,无论是javascrip还是php、java、C#等等,各种语言,都需要正则表达式,也都实现了相应的正则表达式的功能,所以具体的正则表达式属于什么分类,就不好说了。不用纠结,反正无论干什么,都离不开正则表达式,那就要学习。
1.分组捕获
需求:”ab0k012ab9x92ab88g002”,这个字符串中,分别将ab0k012,ab9x92和ab88g002捕获到一个分组里面,该如何做?
(1) 经过长时间的尝试,其实还是没有解决,尝试过一些领宽断言之类的东西
1 | ((?=ab).*)+ |
都不能尽如人意。
(2) 最后通过增加特殊字符串的方式实现了,将ab统统换成^^ab,然后使用:(?:([^\^\^]))+ 正则表达式
1 | ^^ab0k012^^ab9x92^^ab88g002 |
(3) 根据上面的想法,通过添加特殊字符串的形式实现了,如果把特殊字符串转换为ab,是不是也能实现匹配呢?
1 | (?:([^ab]))+ |
上面的正则表达式可以匹配:ab0k012ab9x92ab88g00f2
但是不能正确匹配:ab0k012ab9x92ab88g00a2
(4) 最后终于搞出来了,正确的正则表达式为
1 | (?<=ab).*?(?=(ab|$)) |
(5) 进一步,如果以ab开头
1 | ab(?<=ab).*?(?=(ab|$)) |
(6) 以多种字符开头,以多种字符结尾的,其中是以ab开头或者是le开头,以ab结尾,或者是以le结尾,或者是字符串的结尾都可以
1 | ab0k012ab9x92ab88g00a2le888sdfleooosd |
2.正向肯定预查
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。”(?=pattern)” 小括号中增加了 ?= 前缀,表示的是匹配此分组,但是此分组里的内容不需要被获取。举例:正则表达式 “Windows(?=95|98|NT|2000)” 可以匹配字符串 “Windows2000” 中的 “Windows”,但是不能匹配 “Windows3.1” 中的 Windowds。
3.(?:pattern)
4.常用表达式
(1) 匹配空行和固定开头字符串
匹配换行和空行,实现匹配下面这样的代码,一行之后有空行,然后第一个字符是数字
1 | jljl |
方法一:
1 | \s+$\n\n[0-9] |
方法二:
1 | \n\n[0-9] |
方法三:
1 | \n\n[0-9].\[ |