I have a regular expression that I'v verified in some online regex parsers
^(.*\.(?!(htm|html|class|js)$))?[^.]
How ever implementing this in golang doesn't match the same way the online regex parser does
package main
import (
"fmt"
"regexp"
"strconv"
)
type ParsedConfigFile struct {
prefix string
instanceNum int
extension string
}
// tries to guess config type and instance id from files
func parseFiles(files []string) {
re := regexp.MustCompile(`(type1|type2)_(\d+)\.(csv|ini)`)
var matchedFiles []ParsedConfigFile
for _, file := range files {
match := re.FindStringSubmatch(file)
// we have 3 groups we try to capture in the regex + 1 for the full match
EXPECTED_MATCH_COUNT := 4
if len(match) == EXPECTED_MATCH_COUNT {
fmt.Printf("trying: %v
", file)
instanceNum, strConvErr := strconv.Atoi(match[2])
if strConvErr == nil {
matchedFiles = append(matchedFiles, ParsedConfigFile{
prefix: match[1],
instanceNum: instanceNum,
extension: match[3],
})
}
}
}
}
func main() {
files := []string{
"type1_12.ini", // match
"type1_121111.ini", // match
"type2_1233.csv", // match
"type2_32.csv", // match
"type1_.ini", // don't match
"type2_32.csv.20141027", // don't match
"type1_12.", // don't match
"_12.ini.", // don't match
"_12.ini.11", // don't match
"type1_81.ini.20141028", //dont match
"XNGS.csv", // don't match
}
parseFiles(files)
}
Removing the negated set yields some results but I'm unsure what I have to do mimic the behavior in other regex parser or ignore matches at the end of the filenames
playground link https://play.golang.org/p/6HxutLjnLd
Go's stdlib regexp engine is RE2 which does not support lookaround (e.g. the ?!
negative lookahead operator). You can find the complete set of supported Regular Expression syntax in the documentation: https://golang.org/pkg/regexp/syntax/
If all you need is to ensure that the string ends in a three-character file extension, then you can simplify your expression down to just \.\w{3}$
- a literal period, followed by three characters, followed by the end of the string.