正则表达式Match与Groups:名称捕获位置及场景改写咨询
正则匹配结果的存储逻辑详解
嘿,我来给你掰扯清楚这个事儿哈!
1. Match 0:天生自带的「全局匹配容器」
不管你的正则里有没有用括号定义捕获组,正则引擎都会默认把整个正则表达式匹配到的完整字符串存在Match 0里——这是它的自带行为,根本不需要额外用括号包裹。
比如你提到的模式[A-Za-z0-9_\-\.]+,用它匹配t2时,整个正则匹配到的内容就是t2,这个字符串就会自动存到Match 0里。哪怕模式里没有任何括号,Match 0依然会老老实实存储整体匹配结果。
2. 捕获组:只有括号包裹的内容才会进Match 1、Match 2...
只有用()包裹的部分,才会被当作捕获组单独存储,它们的编号是按左括号出现的顺序从1开始数的:
- 第一个左括号对应的捕获内容是Match 1
- 第二个左括号对应的是Match 2
以此类推,嵌套括号也遵循这个“左括号出现顺序”的规则。
拿你举的邮箱例子来说,假设完整模式是^([A-Za-z0-9_\-\.\ ]+@(([A-Za-z0-9\-])+\.)+([A-Za-z]{2,})),用它匹配name@domain.com alt@yahoo.net:
- Match 0 是整个正则匹配到的第一个完整邮箱:
name@domain.com - Match 1 是最外层括号包裹的全部内容(和Match 0内容一致,因为外层括号把整个邮箱都包了):
name@domain.com - Match 2 是第二个括号组匹配到的
domain. - Match 3 是第三个括号组匹配到的
domain - Match 4 是第四个括号组匹配到的
com
3. 一句话总结逻辑
- Match 0:全局匹配结果,正则引擎自动生成,和有没有捕获组无关
- Match 1~Match N:捕获组匹配结果,只有用
()包裹的部分才会被单独存储,编号按左括号出现顺序排列
内容的提问来源于stack exchange,提问作者Sergio Solorzano
相关产品推荐
相关产品推荐

