正则字符
.
匹配不包括换行的任意字符,在php的s修饰符下面可以匹配换行\s
空格、tab[]
单字符取一个,比如[abc]会匹配a或b或c|
多个数据选一(常用于多字符)|
的作用域是一直往后直到遇到括号(?:)
非捕获组
技巧
- 如果源字符串有换行,使用[\s\S]替换
注意
[]
内符号
^
在首位时候才有特殊意义-
在不是首尾的时候有特殊意义\
本身是转义符,有特殊意义
高级技巧
从大到小,一块块分解
- 65530-65535 ==> 6553[0-5] 末位区间0-5
- 65500-65529 ==> 655[0-2][0-9] 第四位区间0-2,末位区间0-9
- 65000-65499 ==> 65[0-4][0-9]{2} 第三位区间0-4,后两位0-9
- 60000-64999 ==> 6[0-4][0-9]{3} 第二位区间0-4,后三位0-9
- 10000-59999 ==> [1-5][0-9]{4} 第一位区间1-5,后四位0-9
1-9999 ==> [1-9][0-9]{0,3} 第一位只能是1-9,后三位可有可无
最后组合起来:
(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3})根据数据处理需求,可以在正则前后加上^和$,以匹配整个数据串,或者前后加入\b,把它当做单词边界处理。没有限定字符的边界往往是js正则判断中常见的错误之一。
贪婪模式与非贪婪模式
什么时候使用贪婪模式,什么时候使用非贪婪模式,哪个性能好,哪个性能不好,不能一概而论,要根据情况分析。
不过,在平时的时候用,一般使用非贪婪模式较多,因为贪婪模式经常会由于元字符范围限制不严谨而导致匹配越界,得到非预期结果。
在确定的数据结构里,可以尝试使用[^>]*>这样的排除字符贪婪模式替换非贪婪模式,提升匹配的效率
无论使用贪婪模式还是非贪婪模式,在不同语言需要注意回溯次数和嵌套次数的限制,比如在PHP中,pcre.backtrack_limit=100000,pcre.recursion_limit=100000。
环视(断言/零宽断言)
环视,在不同的地方又称之为零宽断言,简称断言。
环视主要有以下4个用法:
(?<=exp)
匹配前面是exp的数据
(?=exp)
匹配后面是exp的数据
(?!exp)
匹配后面不是exp的数据
(?<!exp)
匹配前面不是exp的数据另外,还会看到(?!B)[A-Z]这种写法,其实它是[A-Z]范围里,排除B的意思,前置的(?!B)只是对后面数据的一个限定,从而达到过滤匹配的效果。
环视部分是不占宽度的,所以有零宽断言的叫法。
所谓不占宽度,可以分成两部分理解:
1、环视的匹配结果不纳入数据结果
2、环视它匹配过的地方,下次还能用它继续匹配。模式修饰符
i
不区分大小写
s
的作用主要是让·
能够匹配换行