Negative look-ahead in Go regular expressions
I'm trying to use negative look-aheads in Go.
The following regular expression: BBB(((?!BBB).)*)EEE
http://rubular.com/r/Zw1vopp1MF
However, in Go I get:
error parsing regexp: invalid or unsupported Perl syntax: `(?!`
Are there any alternatives?
Negative lookahead isn't supported for technical reasons, specifically because it conflicts with the O(n)-time guarantees of the library. See the golang-nuts group discussion about this, as well as the Caveats section in Regular Expression Matching in the Wild.
You can express the regular expression you've described without negative lookahead:
BBB([^B]|B[^B]|BB[^B])*EEE
Here's an example to demonstrate:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`BBB([^B]|B[^B]|BB[^B])*EEE`)
fmt.Printf("%#v\n", re.FindAllString("BBB EEE BBB..BBB...EEE", -1))
}
dlclark/regexp2 is a port of the .NET framework's System.Text.RegularExpressions.Regex
engine.
There are some fundamental differences between .NET strings and Go strings that required a bit of borrowing from the Go framework regex engine as well. I cleaned up a couple of the dirtier bits during the port (regexcharclass.cs was terrible), but the parse tree, code emmitted, and therefore patterns matched should be identical.
It's name dropped at the end of the lengthy discussion about O(n) regular expressions, and is caveated:
However, I would advise caution as there are benefits to the re2-based engine that are not provided by more full featured engines with lookarounds. If you have the option then stick with the stdlib.
The cost of features is a slower implementation.
Based off your examples and your expected output, the following would work.
re := regexp.MustCompile(`BBB([^B]*)EEE`)
GoPlay