我有以下代码:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "This is a delimited string, so let's go"
re := regexp.MustCompile(`(?i)(This is a delimited string)|delimited|string`)
matches := re.FindAllString(str, -1)
fmt.Println("We found", len(matches), "matches, that are:", matches)
}
得到的输出为:
We found 1 matches, that are: [This is a delimited string]
如果我将上述代码中的str
更改为:
str := "This is not a delimited string, so let's go"
然后我得到的输出是:
We found 2 matches, that are: [delimited string]
两者都是正确的,但在具有1 match
的第一个块中,str
将100%
与我的正则表达式中的第一个区块(即This is a delimited string
(匹配,而在显示2个匹配的第二个块中的str
,它们都与我的regex中的第一块不匹配。
有没有办法,让我知道str
是否与正则表达式中的第一个块匹配,这样我就可以得到完全匹配or
部分匹配is the
len(matches(`不为零,但正则表达式中第一个块不匹配!
这个正则表达式:
(?i)(This is a delimited string)|delimited|string
匹配这些文字字符串中最左边最长的匹配:
- CCD_ 10
delimited
,或string
将文本This is a delimited string, so let's go
输入到正则表达式中,第一个替换项匹配。它是唯一的匹配,因为它同时消耗了delimited
和string
——搜索在匹配之后的点继续。
将替换文本This is not a delimited string, so let's go
输入到正则表达式会导致2个匹配,因为第一个替换文本不匹配,但第二个(delimited
(和第三个(string
(匹配。
如果您想知道哪个备选方案匹配,只需将每个备选方案括在括号中,使其成为捕获组:
(?i)(This is a delimited string)|(delimited)|(string)`
现在我们可以检查每个捕获组的值:如果它的长度大于1,那么它就是匹配的备选方案。
https://goplay.tools/snippet/nTm56_al__2
package main
import (
"fmt"
"regexp"
)
func main() {
str := "This is a delimited string, so let's go and find some delimited strings"
re := regexp.MustCompile(`(?i)(This is a delimited string)|(delimited)|(string)`)
matches := re.FindAllStringSubmatch(str, -1)
fmt.Println("Matches:", len(matches))
for i, match := range matches {
j := 1
for j < len(match) && match[j] == "" {
j++
}
fmt.Println("Match", i, "matched alternative", j, "with", match[j])
}
}