package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?m)^[^.#,]*[.#,].*?\bMY_STRING\b[^,\r\n]*;(?:video|comment)(*SKIP)(*FAIL)|\bMY_STRING\b`)
var str = `[1]
text,MY_STRING ;comment
text,MY_STRING text ;comment
text,text MY_STRING text ;comment
--------------------------------------------------------------
-> dont catch any above because exist a
**comma** before #MY_STRING# and ;comment after.
--------------------------------------------------------------
[2]
text, MY_STRING , text ;comment
--------------------------------------------------------------
-> catch because exist a **comma** after #MY_STRING#
--------------------------------------------------------------
[3]
text, MY_STRING, MY_STRING ;comment
--------------------------------------------------------------
-> catch first #MY_STRING# but don't catch last #MY_STRING#
because she is between , and ;comment
--------------------------------------------------------------
[4]
MY_STRING
MY_STRING,text
text, MY_STRING,
MY_STRING ;comment
text MY_STRING ;comment
text,MY_STRING,text ;comment
%MY_STRING% , (MY_STRING)
--------------------------------------------------------------
-> catch all, because there's no [comma . #] preceding #MY_STRING#
and no [# ;comment ;video] succeeding
--------------------------------------------------------------
[5]
.MY_STRING
#MY_STRING
MY_STRING#
--------------------------------------------------------------
- > dont catch any
Independent of where MY_STRING is, either what it has between, don't catch any, because they have . or # preceding/proceeding the string.
--------------------------------------------------------------
[6]
MY_STRING, .MY_STRING, #MY_STRING, text, MY_STRING
text, MY_STRING#, MY_STRING, .MY_STRING
--------------------------------------------------------------
-> same as above, just catch MY_STRING samples not containing . #
--------------------------------------------------------------
[7]
text, MY_STRING ;video
MY_STRING ;video
#MY_STRING, MY_STRING, text, text MY_STRING ;video
--------------------------------------------------------------
- > In this case, the string will not be caught independent of where it is or what it has preceding/succeeding because exist the string ;video at the ending.
--------------------------------------------------------------
[8]
text,MY_STRING, text ;comment
^ ok catch (reason explained above)
--------------------------------------------------------------
[9]
text,MY_STRING@ text ;comment
-------------------------------------------------------------- ^ dont catch, because there's no comma after the string, and there's a comma before and ;comment after
--------------------------------------------------------------
[10]
MY_STRING,text,#MY_STRING,text,text,%MY_STRING% @ $text #text <text> ;comment
^[1] ^[2] ^[3]
--------------------------------------------------------------
[1] catch
[2] don't (# preceding)
[3] don't catch, because there's a comma preceding, no comma succeding and at the end line exist the string ;comment
--------------------------------------------------------------
[11]
.MY_STRING,text,MY_STRING,text,text,%MY_STRING% @ $text, #text <text> ;comment
^[1] ^[2] ^[3] ^[4]
--------------------------------------------------------------
[1] don't (dot preceding)
[2] catch
[3] catch because there's a comma on [4] so the string is not anymore between a comma preceding and ;comment succeeding, she is now between a comma preceding a comma succeeding and ;comment`
for i, match := range re.FindAllString(str, -1) {
fmt.Println(match, "found at index", i)
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Golang, please visit: https://golang.org/pkg/regexp/