正向前瞻+重叠匹配正则表达式

时间:2017-12-27 15:16:02

标签: regex go

我正在寻找一个正则表达式来匹配所有未跟随有效的2字符十六进制代码的%(a-fA-F0-9中的2个字符)。我提出(%)(?=([0-9a-fA-F][^0-9a-fA-F]|[^0-9a-fA-F]))效果很好但是在golang 中不受支持,因为前瞻性很明显(?=)。

我怎样才能翻译它(或者让它变得更简单?),以便它可以与go一起使用?

例如,给定字符串%d%2524e%25f%255E00%%%252611%25,它应匹配%子串的第一个%%%和前两个。

ie:https://regex101.com/r/y0YQ1I/2

2 个答案:

答案 0 :(得分:1)

我只在regex101(标记为golang regex)上尝试了这个,但似乎它按预期工作:

HTML
  <!-- Header -->
    <header class="masthead">
      <div class="container">
        <div class="intro-text">
          <h1>voluptatem accusantium</h1>
          <h3 style="margin-top:-2%">UX Research & Design</h3>
                  <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.  </p>
        </div>
      </div>
    </header>

CSS

header.masthead {
  text-align: left;
  color: white;
  background-image: url("../img/headshot.png");
  background-repeat: no-repeat;
  background-attachment: scroll;
  background-position: right 85px top 80px;
  background-size: 400px 481px
}

或更简单:

%[0-9a-fA-F][0-9a-fA-F]|(%)

答案 1 :(得分:0)

这里真正的挑战是位置19和20的匹配重叠,这意味着我们不能使用任何go builtin“FindAll ...”函数,因为他们只找到非 - 重叠比赛。这意味着如果我们想要找到它们,我们必须在后续匹配索引之后重复匹配正则表达式。

对于正则表达式本身,我使用了非捕获组(?:...)而不是前瞻断言。此外,正则表达式还将匹配字符串末尾的百分号,因为它们后面不能跟两个十六进制数字:

func findPlainPercentIndices(s string) []int {
    re := regexp.MustCompile(`%(?:[[:xdigit:]][[:^xdigit:]]|[[:^xdigit:]]|$)`)
    indices := []int{}
    idx := 0

    for {
        m := re.FindStringIndex(s[idx:])
        if m == nil {
            break
        }
        nextidx := idx + m[0]
        indices = append(indices, nextidx)
        idx = nextidx + 1
    }

    return indices
}

func main() {
    str := "%d%2524e%25f%255E00%%%252611%25%%"
    //      012345678901234567890123456789012
    //      0         1         2         3
    fmt.Printf("OK: %#v\n", findPlainPercentIndices(str))
    // OK: []int{0, 19, 20, 31, 32}
}