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][] 等
我有一个 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][] 等