概念一:按单字符匹配
正则里面的数据都是按照单个字符来进行匹配的,这个通过数值区间的例子最容易体现出来,比如,示例一:
我要匹配0-15
的数值区间,用正则来写的话,便是[0-9]|1[0-5]
,这里,便是把0-9这种单字符的情况,和10-15这种多字符的情况拆分开了,使用分支|
来区分开,表示要么是0-9,要么是10-15。
上面是两位数值的情况,现在延伸至1-65535,我个人的处理思想是从大到小,一块块分解:
1. 65530-65535 ==> 6553[0-5] 末位区间0-5
2. 65500-65529 ==> 655[0-2][0-9] 第四位区间0-2,末位区间0-9
3. 65000-65499 ==> 65[0-4][0-9]{2} 第三位区间0-4,后两位0-9
4. 60000-64999 ==> 6[0-4][0-9]{3} 第二位区间0-4,后三位0-9
5. 10000-59999 ==> [1-5][0-9]{4} 第一位区间1-5,后四位0-9
6. 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})
便得到1-65535匹配正则。
根据数据处理需求,可以在正则前后加上^
和$
,以匹配整个数据串,或者前后加入\b
,把它当做单词边界处理。没有限定字符的边界往往是js正则判断中常见的错误之一。
概念二:匹配优先和不匹配优先
匹配优先和不匹配优先从字面理解也是比较容易的,所谓匹配优先,就是,能匹配我就先匹配;不匹配优先就是,能不匹配我就先不匹配,这段匹配先跳过,先看看后面的匹配能不能通过。
概念三:贪婪模式与非贪婪模式
正则的贪婪模式和非贪婪模式是一个比较容易混淆的概念,不过,我们可以这么理解,一个人很贪婪,所以他会能拿多少拿多少,换过来,那就是贪婪模式下的正则表达式,能匹配多少就匹配多少,尽可能最多。而非贪婪模式,则是能不匹配就不匹配,尽可能最少。
概念四:环视(断言/零宽断言)
环视,在不同的地方又称之为零宽断言,简称断言。
用一句通俗的话解释:
环视,就是先从全局环顾一遍正则,(然后断定结果,)再做进一步匹配处理。
断言,就是先从全局环顾一遍正则,然后断定结果,再做进一步匹配处理。
两个虽然字面不一样,意思却是同一个,都是做全局观望,再做进一步处理。
环视的作用相当于对其所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。
环视主要有以下4个用法: (?<=exp)
匹配前面是exp的数据 (?<!exp)
匹配前面不是exp的数据 (?=exp)
匹配后面是exp的数据 (?!exp)
匹配后面不是exp的数据