英文:
I use regexp.Compile(`^123(?:4)`) to try to get "123" from "1234abcd" while it came out to be "1234"
问题
我正在使用Go 1.8.3进行编码,并且我想使用regexp包从"1234abcd"中获取"123"。当我使用regexp.Compile("^123(?:4)")时,它返回了"1234"。
以下是你的代码的中文翻译:
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
英文:
I'm coding with go 1.8.3 and I want to use regexp package to get "123"
from "1234abcd"
. When I used regexp.Compile("^123(?:4)")
, it came to "1234"
.
Coding in this: 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))
}
came out: 1234
expected: 123
答案1
得分: 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
来捕获它。
英文:
according to https://groups.google.com/forum/#!topic/golang-nuts/8Xmvar_ptcU
> A capturing group is a ( ) that is recorded in the indexed match list, what other languages might call $1, $2, $3 and so on. A non-capturing group is a way to use ( ) without taking one of those numbers. Whether a group is capturing or not has no effect on the full string matched by the overall expression. The full string matched here is "datid=12345", and so that is what FindString returns.
>
> You use non-capturing groups for the same reason you use parentheses in the arithmetic expression (x+y)*z: overriding the default operator precedence. The precedence is the same here with or without the group.
>
> Put another way, (?:datid=)[0-9]{5} is exactly the same regular expression as datid=[0-9]{5}.
so that behavior is intended by golang's developer.
the workaround is using regexp.Compile(`^(123)(?:4)`)
, and capture it using FindStringSubmatch
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论