我正在使用go 1.8.3进行编码,我想使用regexp包从"123"
获取"1234abcd"
。当我使用regexp.Compile("^123(?:4)")
时,它来到了"1234"
。
编码:https://play.golang.org/p/jB7FmxWz9r
package main
import (
"regexp"
"fmt"
)
func main() {
test, err := regexp.Compile(`^123(?:4)`)
if err != nil {
fmt.Println(err)
return
}
input := "1234|wserw"
fmt.Println(test.FindString(input))
}
出来了:1234
预期:123
答案 0 :(得分:2)
根据https://groups.google.com/forum/#!topic/golang-nuts/8Xmvar_ptcU
捕获组是一个(),它记录在索引的匹配列表中,其他语言可能称为$ 1,$ 2,$ 3等等。非捕获组是一种使用()而不取其中一个数字的方法。组是否正在捕获对整个表达式匹配的完整字符串没有影响。这里匹配的完整字符串是" datid = 12345",这就是FindString返回的内容。
您使用非捕获组的原因与在算术表达式(x + y)* z中使用括号相同:覆盖默认运算符优先级。无论是否有群组,优先权都是相同的。
换句话说,(?:datid =)[0-9] {5}与datid = [0-9] {5}完全相同的正则表达式。
因此golang的开发人员会采取行为。
变通方法正在使用regexp.Compile(`^(123)(?:4)`)
,并使用FindStringSubmatch