Welcome to Jacksile's Blog

正则表达式中组的理解

在正则中,“组”表示一个整体,可分为捕获组和非捕获组。我们可以结合生活中的例子来理解它,比如一部手机,组内的因素有必需和非必需之分,如手机可以有操作系统,也可以没有,但一定要有电池。

下面举例说明:

这是验证邮箱的正则表达式:

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

这个正则涉及了多个非捕获组,现在我们以@(?:[\w](?:[\w-]*[\w])?\.)+中的(?:[\w](?:[\w-]*[\w])?\.)+为例,这是验证邮箱地址中@符号后包括.部分的字符,如字符串@abc.com,这个表达式就是验证abc.,现在在这个表达式中把这部分验证作为一个整体,其中必需因素包括[\w].,即是说这部分字符串最基本包括如@a.com。由于这个组的量词为+,所以它可以为@a.a.a.com

现在再来看一下这个表达式里面的一个非捕获组(?:[\w-]*[\w])?。在示例字符串@a.com中,a.@com之间最起码的要素,在a.之间可以允许[w]-符号出现0次或多次,如果仅此要求,这里写作(?:[\w-]*)就好了,关键是结尾不允许是-符号,可以是[\w][\w]即为这个组的必须因素,这个组的量词为?,表示它可以不出现或出现一次。举例子,邮箱中的字符串@a-b.是允许的,而@a-.是不允许的,因为-这个组中缺少必须因素[\w]

小结
1.当我们要对正则中的某个子表达式的非必需要素和必需要素进行定义时往往就需要用组。
2.如果一个正则中涉及到了多个组而这些组无需捕获则建议采用非捕获组,这样提高了正则引擎的性能。

 

posted @ 2016-04-19 15:12 Angelaboy 阅读(...) 评论(...) 编辑 收藏