re = /(?(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
)/ixm
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'
# Print the match result
str.match(re) do |match|
puts match.to_s
end
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 Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html