【发布时间】:2021-05-30 00:42:40
【问题描述】:
我知道 Golang 不支持环视,但是我无法理解转换。
正则表达式:^(?!d-)([\da-zA-Z]+)([-][\da-zA-Z])$
【问题讨论】:
我知道 Golang 不支持环视,但是我无法理解转换。
正则表达式:^(?!d-)([\da-zA-Z]+)([-][\da-zA-Z])$
【问题讨论】:
环顾四周后,我认为@tshiono 想法是最有意义的想法,但正则表达式与我的预期不符。 我最终得到了这样的结果
package main
import (
"fmt"
"regexp"
)
func main() {
st := []string{
"test-adccount",
"s-asdgaysdtuaystdua",
"2342348jtdstyfu",
"kdshkjfshdkfjhd-jkshdfjkshdf",
"uysiufysdusidyf-jsdkhfjksdhf",
"ausyduaysidyaisyd",
"2abc-f",
"d-23423423",
"-iasodaisdyauiysd",
"sudyfisdufy82|ldjf",
"klskdjfsd898883---sdfkjskdfjsld",
}
for _, s := range st {
r1 := regexp.MustCompile(`^([\da-zA-Z]+)([\da-zA-Z-]+)$`)
r2 := regexp.MustCompile(`^(d-).+$`)
if r1.MatchString(s) && !r2.MatchString(s) {
fmt.Println(fmt.Sprintf("%s :: matched", s))
} else {
fmt.Println(fmt.Sprintf("%s :: does not matched", s))
}
}
}
【讨论】:
可以在不使用PCRE 的情况下更改正向环视断言,但是
负环视不能。我们需要将正则表达式拆分为两个步骤逻辑。
例如,我们可以在python 中说:
import re
s = '2abc-D' # matches
#s = 'd-D' # doesn't match
m = re.match(r'^(?!d-)([\da-zA-Z]+)(-[\da-zA-Z])$', s)
if (m):
print(m.groups())
在Golang,我们需要说:
package main
import (
"fmt"
"regexp"
)
func main() {
s := "2abc-D" // matches
// s := "d-D" // doesn't match
r := regexp.MustCompile(`^([\da-zA-Z]+)(-[\da-zA-Z])$`)
if !(regexp.MustCompile(`^d-`).MatchString(s)) {
fmt.Println(r.FindStringSubmatch(s))
}
}
【讨论】: