58556d7281
ADDED: * netx.IsPub * encodingx/hexx Rest are mostly small corrections and docs
58 lines
1.3 KiB
Plaintext
58 lines
1.3 KiB
Plaintext
- write a flag parser/converter for github.com/scorpionknifes/go-pcre (and github.com/GRbit/go-pcre) :
|
|
----
|
|
// i CASELESS
|
|
// m MULTILINE
|
|
// s DOTALL
|
|
// x EXTENDED
|
|
// U UNGREEDY
|
|
// 8 UTF8 (non-standard flag letter; standard PCRE uses (*UTF8) outside (?...) syntax)
|
|
//
|
|
// Flags after a '-' inside group disable associated flag and are ignored
|
|
// (applies inside the regex engine once prefix is stripped).
|
|
// pattern, flags := ParsePrefixFlags(`(?im)^hello`)
|
|
// re := pcre.MustCompile(pattern, flags)
|
|
func ParsePrefixFlags(pattern string) (string, int) {
|
|
if !strings.HasPrefix(pattern, "(?") {
|
|
return pattern, 0
|
|
}
|
|
|
|
end := strings.IndexByte(pattern, ')')
|
|
if end < 0 {
|
|
return pattern, 0
|
|
}
|
|
|
|
inner := pattern[2:end] // everything between "(?" and ")"
|
|
|
|
for _, ch := range inner {
|
|
if !strings.ContainsRune("imsxU8-", ch) {
|
|
return pattern, 0
|
|
}
|
|
}
|
|
|
|
positive := inner
|
|
if dash := strings.IndexByte(inner, '-'); dash >= 0 {
|
|
positive = inner[:dash]
|
|
}
|
|
|
|
var flags int
|
|
for _, ch := range positive {
|
|
switch ch {
|
|
case 'i':
|
|
flags |= pcre.CASELESS
|
|
case 'm':
|
|
flags |= pcre.MULTILINE
|
|
case 's':
|
|
flags |= pcre.DOTALL
|
|
case 'x':
|
|
flags |= pcre.EXTENDED
|
|
case 'U':
|
|
flags |= pcre.UNGREEDY
|
|
case '8':
|
|
flags |= pcre.UTF8
|
|
}
|
|
}
|
|
|
|
return pattern[end+1:], flags
|
|
}
|
|
----
|