正则表达式中组的理解
在正则中,“组”表⽰⼀个整体,可分为捕获组和⾮捕获组。我们可以结合⽣活中的例⼦来理解它,⽐如⼀部⼿机,组内的因素有必需和⾮必需之分,如⼿机可以有操作系统,也可以没有,但⼀定要有电池。
下⾯举例说明:
这是验证邮箱的正则表达式:
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
这个正则涉及了多个⾮捕获组,现在我们以@(?:[\w](?:[\w-]*[\w])?\.)+中的(?:[\w](?:[\w-]*[\w])?\.)+为例,这是验证邮箱地址中@符号后包括.部分的字符,如字符串@abc,这个表达式就是验证abc.,现在在这个表达式中把这部分验证作为⼀个整体,其中必需因素包括[\w]和.,即是说这部分字符串最基本包括如@a。由于这个组的量词为+,所以它可以
为@a.a.a。
现在再来看⼀下这个表达式⾥⾯的⼀个⾮捕获组(?:[\w-]*[\w])?。在⽰例字符串@a中,a.为@与com之间最起码的要素,在a与.之间可以允许[w]或-符号出现0次或多次,如果仅此要求,这⾥写作(?:[\w-]*)就好
了,关键是结尾不允许是-符号,可以是[\w],[\w]即为这个组的必须因素,这个组的量词为?,表⽰它可以不出现或出现⼀次。举例⼦,邮箱中的字符串@a-b.是允许的,⽽@a-.是不允许的,因为-这个组中缺少必须因素[\w]。匹配邮箱的正则表达式
⼩结
1.当我们要对正则中的某个⼦表达式的⾮必需要素和必需要素进⾏定义时往往就需要⽤组。
2.如果⼀个正则中涉及到了多个组⽽这些组⽆需捕获则建议采⽤⾮捕获组,这样提⾼了正则引擎的性能。