PCRE 到 RE2 正则表达式的转换,负先行

PCRE to RE2 regex conversion with negative lookahead

我有一个 pcre 正则表达式字符串,我正在尝试转换为 re2。 这是要匹配的 pcre 和字符串。

\%(?!$|\W)

它仅在 % 上匹配,以防万一!或非字字符不

%252525253E%252553Csvg%25252525252525252Fonload%252525252525252525252525252525252525252525252525252525253Dalert(document.domain)%222[51225]=51225

结果:% % % %

我最好的转换是:

\%[^!$|\W]

结果:%2 %3 %3 %2 %3 %3

然而,这与第一个数字匹配,我不希望这样,我希望它的行为与 pcre 版本完全一样。 这是我测试的地方:

regex-golang DOT appspot DOT com/assets/html/index.html

regex101 点 com

任何帮助将不胜感激。

您可以尝试这样的操作:

(\%)(?:[^!$|\W])

因为 golang 没有负面前瞻(至少我是这么认为的)你可以使用非捕获组 instead.So 在这个例子中你需要使用第一个捕获组(e.g.matches[1] 而不是匹配 [0]) https://regex101.com/r/THTWwB/2

编辑: 下面是一个更详细的 golang 示例,可帮助您理解上述正则表达式:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    r := regexp.MustCompile(`(\%)(?:[^!$|\W])`)
    m := r.FindAllStringSubmatch(`%252525253E%252553Csvg%25252525252525252Fonload%252525252525252525252525252525252525252525252525252525253Dalert(document.domain)%252525252`,-1)
    fmt.Printf("%#v\n",m )
}

在此示例中,您可以使用第一个捕获 group.So 来访问您的 %,例如 m[0][0] 将是 %2,但 m[0][1] 将只是 %(第一个捕获组)。请注意,第一个索引是 matches.So 的索引,第一个匹配项存储在 m[0][] 中,第二个在 m[1][] 等