将PERL Regex转换为Golang RE2



我知道在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))
}
}
}

https://play.golang.org/p/j-7INwyDwU4

可以在不使用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))
}
}

最新更新