Groovy正则中.+运算符的作用及分组匹配逻辑解析
解析Groovy正则提取代码的工作原理
先修正下原代码的小问题——字符串必须加引号,不然Groovy会把drink-a-glass-of-the-orange-juice当成变量名报错:
def myString = "drink-a-glass-of-the-orange-juice" def getVars = myString =~ /drink-(.+)-of-the-(.+)/ def var1 = getVars[0][1] def var2 = getVars[0][2]
下面一步步拆解这段代码的逻辑:
1. =~操作符的作用
Groovy里=~是正则匹配操作符,它不会返回布尔值,而是返回一个Matcher对象。这个对象会存储整个正则匹配的所有结果,包括完整匹配的字符串和每个捕获组的内容。
2. 正则表达式/drink-(.+)-of-the-(.+)/的细节
重点说你疑惑的.+:
.:匹配任意单个字符(除换行符)+:贪婪匹配修饰符,要求前面的字符(这里是.)至少出现1次,且尽可能多的匹配字符- 括号
():定义捕获组,会把括号内匹配到的内容单独存起来,方便后续提取。这里有两个捕获组:- 第一个
(.+):匹配drink-和-of-the-之间的所有字符,也就是你要的var1 - 第二个
(.+):匹配-of-the-之后的所有字符,也就是你要的var2
- 第一个
3. Matcher对象的结构(为什么是嵌套的)
getVars是Matcher实例,当你用getVars[0]访问时,取的是第一个匹配结果(这里整个字符串刚好匹配一次)。这个结果是一个数组:
getVars[0][0]:存储整个正则匹配到的完整字符串,也就是"drink-a-glass-of-the-orange-juice"getVars[0][1]:第一个捕获组的内容,也就是"a-glass"getVars[0][2]:第二个捕获组的内容,也就是"orange-juice"
所以不是.+把内容存进嵌套列表,而是正则的捕获组把匹配内容存在Matcher的匹配结果里,Matcher的结果结构本身就是嵌套的——外层是所有匹配项的集合,内层是单个匹配项的完整内容+各个捕获组的内容。
内容的提问来源于stack exchange,提问作者sirius78m
相关产品推荐
相关产品推荐

