package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?ims)(?(DEFINE)
(?<prepend>
(?>
\s++
| #multi-line comment by Jeffrey Friedl (fastest)
/\*
[^*]* \*+
(?:[^*/][^*]*\*+)*
/
| ;++
)*+
)
#https://www.postgresql.org/docs/11/sql-commands.html
(?<command>abort|alter|begin|cache|call|checkpoint|cluster|comment|commit|copy|create|deallocate|delete|discard|do|drop|execute|flush|grant|import\s++foreign\s++schema|insert|kill|load|lock|prepare|prepare\s++transaction|reassign\s++owned|refresh\s++materialized\s++view|release\s++savepoint|rename|replace|reset|revoke|rollback|select\s++into|set\s++constraints|start\s++transaction|truncate|update)
)
^
(?&prepend)
\K
(?&command)
\b
(?!
(?&prepend)
\( #REPLACE() function can be similar to command
)`)
var str = `WITH t1 AS (
-- UPDATE
/* INSERT */
SELECT *
FROM t
WHERE s =
REPLACE(s, 'a', 'b')
),
t2 AS (
-- комментарий UPDATE
/* INSERT
*/UPDATE--
* FROM t SET i = 1
RETURNING *
),
INSERT b
SELECT * FROM t2`
if len(re.FindStringIndex(str)) > 0 {
fmt.Println(re.FindString(str),"found at index",re.FindStringIndex(str)[0])
}
}
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/