【问题标题】:Convert PERL Regex to Golang RE2将 PERL 正则表达式转换为 Golang RE2
【发布时间】:2021-05-30 00:42:40
【问题描述】:

我知道 Golang 不支持环视,但是我无法理解转换。

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

【问题讨论】:

    标签: regex go


    【解决方案1】:

    环顾四周后,我认为@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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,您的想法完全有道理,但是正则表达式不是我所期望的。请查看原始正则表达式regex101.com/r/eFb0pn/1,您的答案仅匹配其中一个字符串,而不是其中一些regex101.com/r/4fY2yj/1。感谢您对此进行调查
      • 感谢您的反馈。恐怕您提到的正则表达式与原始帖子中的正则表达式不同:)。但是您的答案似乎效果很好。干得好!
      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2012-08-21
      • 1970-01-01
      • 2012-12-04
      • 2015-09-26
      相关资源
      最近更新 更多