首页 文章

具有负前瞻性的PCRE到RE2正则表达式转换

提问于
浏览
0

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

\%(?!$|\W)

它只匹配%,如果有!或非字char没有

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

结果: % % % %

我最好的转换是这样的:

\%[^!$|\W]

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

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

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

regex101 DOT com

任何帮助将不胜感激 .

1 回答

  • 0

    你可以尝试这样的事情:

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

    由于golang没有负前瞻(至少我认为如此),你可以使用非捕获组 . 所以在这个例子中你需要使用第一个捕获组(egmatches [1]而不匹配[0] )https://regex101.com/r/THTWwB/2

    EDIT: 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] []等中

相关问题