Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将PERL正则表达式转换为Golang RE2_Regex_Go - Fatal编程技术网

Regex 将PERL正则表达式转换为Golang RE2

Regex 将PERL正则表达式转换为Golang RE2,regex,go,Regex,Go,我知道Golang不支持lookaround,但是我无法了解转换 正则表达式:^(?!d-([\da-zA-Z]+)([-][\da-zA-Z])$可以在不使用PCRE的情况下更改正向环视断言,但是 消极环顾不能。我们需要将正则表达式分成两步逻辑。 例如,我们可以在python中说: import re s = '2abc-D' # matches #s = 'd-D' # doesn't match m = re.match(r'^(?!d-)(

我知道Golang不支持lookaround,但是我无法了解转换


正则表达式:^(?!d-([\da-zA-Z]+)([-][\da-zA-Z])$

可以在不使用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())
在歌朗中,我们需要说:

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))
    }
}

环顾四周后,我认为@tshiono的想法是最有意义的,但regex与我的预期不符。 我的结局是这样的

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))
    }
  }
}

谢谢,你的想法完全有道理,但是regex不是我所期望的。请查看原始正则表达式,您的答案只匹配其中一个字符串,而不是其中一些字符串。感谢您对此进行调查谢谢您的反馈。恐怕您提到的正则表达式与原始帖子中的不同:)。但你的答案似乎很有效。干得好