戈朗:为什么regexp.FindAllStringSubmatch()返回[][]字符串而不是[]字符串?

戈朗:为什么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]] 我搞不

我是新手,这是我第一次处理regexp

我有点惊讶,
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个字符
  • (mes)
    -捕获组1:a
    mes
    子字符串
  • *$
    -字符串的其余部分
因此,匹配值就是整个字符串。它将是输出中的第一个值。然后,因为有一个捕获组,所以它在结果中必须有一个位置,因此,
mes
被作为列表中的第二项放置

因为可能有超过1个匹配项,所以我们需要一个列表列表

更好的示例可能是具有多个匹配/子匹配提取(也可能是可选组)的示例:

[^aouiye]([aouiye])([^aouiye])?
匹配一个非元音字母、一个元音字母和一个非元音字母,将最后两个字母分成不同的组#1和#2

结果是
[[“som”“o”“m”][“ri”“i”“]”]
。有2个匹配项,每个匹配项包含一个匹配值、组1值和组2值。由于
ri
匹配没有捕获到第2组(
([^aouiye])?
)中的文本,因此它是空的,但它仍然存在,因为该组是在regex模式中定义的。

提取匹配和捕获的子匹配

子匹配是由正则表达式部分匹配的文本的一部分,正则表达式部分用一对未换序的括号括起来(所谓的括号)

在您的情况下,
^.*(mes)。*$
匹配:

  • ^
    -字符串的开头
  • *
    -尽可能多的任意0个字符
  • (mes)
    -捕获组1:a
    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)
}