戈朗:为什么regexp.FindAllStringSubmatch()返回[][]字符串而不是[]字符串?
我是新手,这是我第一次处理regexp 我有点惊讶,戈朗:为什么regexp.FindAllStringSubmatch()返回[][]字符串而不是[]字符串?,regex,go,Regex,Go,我是新手,这是我第一次处理regexp 我有点惊讶,someregex.FindAllStringSubmatch(“somestring”,-1)返回一个片段[]string而不是一个简单的片段:[]string 例如: someRegex,:=regexp.Compile(“^.*(mes)。*$”) 匹配项:=someRegex.FindAllStringSubmatch(“somestring”,-1) fmt.Println(匹配)//日志[[somestring mes]] 我搞不
someregex.FindAllStringSubmatch(“somestring”,-1)
返回一个片段[]string
而不是一个简单的片段:[]string
例如:
someRegex,:=regexp.Compile(“^.*(mes)。*$”)
匹配项:=someRegex.FindAllStringSubmatch(“somestring”,-1)
fmt.Println(匹配)//日志[[somestring mes]]
我搞不懂这种行为的原因是什么
FindAllStringSubmatch是FindStringSubmatch的“全部”版本;信息技术
返回表达式所有连续匹配项的切片,如下所示
由包注释中的“全部”描述定义。回报
值nil表示不匹配
总而言之:您需要一个字符串数组,因为这是FindStringSubmatch的所有版本。FindStringSubmatch将返回单个字符串数组
FindAllStringSubmatch是FindStringSubmatch的“全部”版本;信息技术
返回表达式所有连续匹配项的切片,如下所示
由包注释中的“全部”描述定义。回报
值nil表示不匹配
总而言之:您需要一个字符串数组,因为这是FindStringSubmatch的所有版本。FindStringsSubmatch将返回单个字符串数组。提取匹配项和捕获的子匹配项
子匹配是由正则表达式部分匹配的文本的一部分,正则表达式部分用一对未换序的括号括起来(所谓的括号)
在您的情况下,^.*(mes)。*$
匹配:
-字符串的开头^
-尽可能多的任意0个字符*
-捕获组1:a(mes)
子字符串mes
-字符串的其余部分*$
mes
被作为列表中的第二项放置
因为可能有超过1个匹配项,所以我们需要一个列表列表
更好的示例可能是具有多个匹配/子匹配提取(也可能是可选组)的示例:
[^aouiye]([aouiye])([^aouiye])?
匹配一个非元音字母、一个元音字母和一个非元音字母,将最后两个字母分成不同的组#1和#2
结果是[[“som”“o”“m”][“ri”“i”“]”]
。有2个匹配项,每个匹配项包含一个匹配值、组1值和组2值。由于ri
匹配没有捕获到第2组(([^aouiye])?
)中的文本,因此它是空的,但它仍然存在,因为该组是在regex模式中定义的。提取匹配和捕获的子匹配
子匹配是由正则表达式部分匹配的文本的一部分,正则表达式部分用一对未换序的括号括起来(所谓的括号)
在您的情况下,^.*(mes)。*$
匹配:
-字符串的开头^
-尽可能多的任意0个字符*
-捕获组1:a(mes)
子字符串mes
-字符串的其余部分*$
mes
被作为列表中的第二项放置
因为可能有超过1个匹配项,所以我们需要一个列表列表
更好的示例可能是具有多个匹配/子匹配提取(也可能是可选组)的示例:
[^aouiye]([aouiye])([^aouiye])?
匹配一个非元音字母、一个元音字母和一个非元音字母,将最后两个字母分成不同的组#1和#2
结果是
[[“som”“o”“m”][“ri”“i”“]”]
。有2个匹配项,每个匹配项包含一个匹配值、组1值和组2值。由于ri
匹配没有捕获到第2组(([^aouiye])?
)中的文本,因此它是空的,但它仍然存在,因为该组是在regex模式中定义的。因为它需要一个位置来存储子匹配,即在模式中定义的组,带有成对的未替换括号。你的意思是什么?你读过了吗?你试过这个例子吗?您的示例正则表达式匹配整个字符串并捕获mes
。一定有一个地方可以进行匹配和捕获,对吧?是的,我读过这个,但我不想尝试这些例子,现在更清楚了,谢谢。因为它需要一个地方来存储子匹配,即模式中定义的组,带有成对的未设花括号。你是什么意思?你读过吗?你试过这个例子吗?您的示例正则表达式匹配整个字符串并捕获mes
。一定有一个地方可以进行比赛和拍摄,对吧?是的,我读过这篇文章,但我不想尝试这些例子,现在更清楚了,谢谢。
package main
import (
"fmt"
"regexp"
)
func main() {
someRegex, _ := regexp.Compile(`[^aouiye]([aouiye])([^aouiye])?`)
matches := someRegex.FindAllStringSubmatch("somestri", -1)
fmt.Printf("%q\n", matches)
}