1

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

\%(?!$|\W)

它仅在 % 上匹配,以防万一!或非单词 char 不

%252525253E%252553Csvg%25252525252525252Fonload%252525252525252525252525252525252525252525252525252525253Dalert(document.domain)%252525252

结果:% % % %

我最好的转换是这样的:

\%[^!$|\W]

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

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

正则表达式-golang DOT apppot DOT com/assets/html/index.html

regex101 DOT com

任何帮助将不胜感激。

4

1 回答 1

0

你可以尝试这样的事情:

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

由于 golang 没有负前瞻(至少我认为是这样),因此您可以改用非捕获组。因此在此示例中,您将需要使用第一个捕获组(egmatches[1] 而不是 matches[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 )
}

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

于 2017-08-30T20:32:14.793 回答