SQL / Regex挑战/难题:如何从SQL代码中删除注释(通过使用SQL查询)?

时间:2016-10-07 07:06:33

标签: sql regex oracle comments teradata

要求

  • 应删除单行评论(例如 - 我的评论)。
  • 应删除多行评论(例如/ *我的评论* /)。
  • 字符串文字的内容(例如'这是一个多行评论:/ *我的评论* /')应该被忽略。
  • 应忽略标识符的内容(例如" - 第1列 - ")。

文字和标识符

文字和标识符可以跨越多行

单行评论

单行注释可能是代码的最后一个元素,可能不会以换行符结束。

嵌套的多行注释

在SQL Server和PostgreSQL等数据库中,可以嵌套多行注释,例如

/* outer comment /* inner comment */ */

以下代码无效,因为只有内部注释被关闭:

/* opened outer comment /* closed inner comment */

在Teradata,Oracle,MySql和SQLite等数据库中,没有嵌套注释的概念。 以下代码无效,因为评论已使用最左边的* /。

关闭
/* comment /* is closed */ ERROR */

但这是一个有效的代码:

/* comment /* still the same comment */

1 个答案:

答案 0 :(得分:2)

解决方案

<强> Teradata的

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAoHDPXfbdKEZDmLsxPNlWY3gBGzG69p0vTrhRZEzO09p5kZ35
T1y9cZAig+lEgY7U/trDWh0d1ABSfsLwT/dv2AAeBE2+avYE+v1jyr6N3FzFXS2O
jKOTkUy+Xw54aAlYHh4S8/K41rrxjcL7cjORWojl+4ZTfGLqCZE8Ga6c41MxBM9v
8ky9Kh2Tnf1zMnGk3Xd69jKnfsZyz7pzeNAZ8g0lezDt8r8b472fXTW2rnwezhTR
YsAbBjoP+P2JhNIQEHXXoTLqflQMfX34TTQLzg5OYOpNNezSqEFh9lFRvnE5B6h+
ov7qF+KyWT17dZMrywd2M6ixVFi3u6JbR/E/9QIDAQABAoIBAGhsZBtVVGYlLVPX
6lkfX+HHtnibqoNelO7YemkcsLUkimFjf2PPCaJDXKOcjLECZNEnU2RwdPyJ5SeJ
+10gwBPHJ8JHU3tMertddrj7w1s8qlxWDWSuBprYZ0N5KJcWFdssWcubHADulc9d
q8iNlbpmRcGqkOXxf0AQ3hwdERHHCLgJzB9Djlurwine1Xs33ZQkr0DecHRS5Unr
IbH9YLKQvGzdohrQfDTSntf/79wxdKRjdiAvPv5AQMz4lrEKYKLp+4B0j3kRq3LN
mokNdCcuhVJKuuN8s4C8EaBYByfWJbzVG2ZqHyoF0Zy1eFkTrXKoaExdv1q37Q3r
hVtD8CECgYEA0YD7sLkrt9WhTIMc0oUdeLLcpI6vvbmJtdkM1bUm/hpacG4VvpJs
Y/Txw4qHydCcbFIh4EyhuEcvnHrbFReyqWB25hLDnsOT/js76xbdJFVN+g7B+pCb
DfDv7LMKf8iJjVO+W5gnxxCrTrW9YbLs11vZUYcMnzySnsHYHtD7/C0CgYEAxAxK
EwkkTMvT0AvyBK6d+EzZPwcSpokWMqs8K2iGdQiGWuvCvrwaSPFOWS54RXx0Cm7j
iE5Nx5U1OXrA2iTwxTMXjcbHHL0mZ5KJIIP+qSu7839hK1b4bx45k0rjiDH5O+we
8y6gAh7Ni+T+7U2LqVBBMVbNzUycTztDshwxh+kCgYEAmCKpIykkhSe+LRidCocd
4rNIJLt1BTpBtWs7tckJ2sZ6XGCkq7Iawe9yzQPBHZ2+qa5u6TncyjvvaBuTElsW
I4docCS6J4Vw59JN7aa5yhOkP20OEg2Ge3Y2VFWjzy1qLdXdSxhP8m+5Zrv1HYhY
Ev+g7WI7mTrcYirz7VTnV7UCgYEAqXRR5qhFNxgLSk248HEaXA/Yy9DKPyZJCJzX
0lFzvt8Seq5D02d1dM0WwqEXFkCfcJEunJfKRRPkQH2pCiVZ86nY1xQU8PNRqb6Q
Romw6frCZ5MXo0V2UV2XuIfHqeZAHppWmi4X4h1L33qdGvKnID8dSo9ULfrlNNru
BZq2+VkCgYBV9wCdkG9CeqpJ2ZrEE4S7ZKUzbQY2nRpLTVp4fS07iE19XGoe+mZH
xFdR7t6mCqddY1SJ5qbKta0I4ibUw5LpaG0odVduqbJmIJskSyocVfQPd7qfoIch
Fku3d1WZiU4DNudSglSf2PIzw6S7Lp1Lp6n5wDzdxF3uJFYv1twlVQ==
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAoHDPXfbdKEZDmLsxPNlWY3gBGzG69p0vTrhRZEzO09p5kZ35
T1y9cZAig+lEgY7U/trDWh0d1ABSfsLwT/dv2AAeBE2+avYE+v1jyr6N3FzFXS2O
jKOTkUy+Xw54aAlYHh4S8/K41rrxjcL7cjORWojl+4ZTfGLqCZE8Ga6c41MxBM9v
8ky9Kh2Tnf1zMnGk3Xd69jKnfsZyz7pzeNAZ8g0lezDt8r8b472fXTW2rnwezhTR
YsAbBjoP+P2JhNIQEHXXoTLqflQMfX34TTQLzg5OYOpNNezSqEFh9lFRvnE5B6h+
ov7qF+KyWT17dZMrywd2M6ixVFi3u6JbR/E/9QIDAQABAoIBAGhsZBtVVGYlLVPX
6lkfX+HHtnibqoNelO7YemkcsLUkimFjf2PPCaJDXKOcjLECZNEnU2RwdPyJ5SeJ
+10gwBPHJ8JHU3tMertddrj7w1s8qlxWDWSuBprYZ0N5KJcWFdssWcubHADulc9d
q8iNlbpmRcGqkOXxf0AQ3hwdERHHCLgJzB9Djlurwine1Xs33ZQkr0DecHRS5Unr
IbH9YLKQvGzdohrQfDTSntf/79wxdKRjdiAvPv5AQMz4lrEKYKLp+4B0j3kRq3LN
mokNdCcuhVJKuuN8s4C8EaBYByfWJbzVG2ZqHyoF0Zy1eFkTrXKoaExdv1q37Q3r
hVtD8CECgYEA0YD7sLkrt9WhTIMc0oUdeLLcpI6vvbmJtdkM1bUm/hpacG4VvpJs
Y/Txw4qHydCcbFIh4EyhuEcvnHrbFReyqWB25hLDnsOT/js76xbdJFVN+g7B+pCb
DfDv7LMKf8iJjVO+W5gnxxCrTrW9YbLs11vZUYcMnzySnsHYHtD7/C0CgYEAxAxK
EwkkTMvT0AvyBK6d+EzZPwcSpokWMqs8K2iGdQiGWuvCvrwaSPFOWS54RXx0Cm7j
iE5Nx5U1OXrA2iTwxTMXjcbHHL0mZ5KJIIP+qSu7839hK1b4bx45k0rjiDH5O+we
8y6gAh7Ni+T+7U2LqVBBMVbNzUycTztDshwxh+kCgYEAmCKpIykkhSe+LRidCocd
4rNIJLt1BTpBtWs7tckJ2sZ6XGCkq7Iawe9yzQPBHZ2+qa5u6TncyjvvaBuTElsW
I4docCS6J4Vw59JN7aa5yhOkP20OEg2Ge3Y2VFWjzy1qLdXdSxhP8m+5Zrv1HYhY
Ev+g7WI7mTrcYirz7VTnV7UCgYEAqXRR5qhFNxgLSk248HEaXA/Yy9DKPyZJCJzX
0lFzvt8Seq5D02d1dM0WwqEXFkCfcJEunJfKRRPkQH2pCiVZ86nY1xQU8PNRqb6Q
Romw6frCZ5MXo0V2UV2XuIfHqeZAHppWmi4X4h1L33qdGvKnID8dSo9ULfrlNNru
BZq2+VkCgYBV9wCdkG9CeqpJ2ZrEE4S7ZKUzbQY2nRpLTVp4fS07iE19XGoe+mZH
xFdR7t6mCqddY1SJ5qbKta0I4ibUw5LpaG0odVduqbJmIJskSyocVfQPd7qfoIch
Fku3d1WZiU4DNudSglSf2PIzw6S7Lp1Lp6n5wDzdxF3uJFYv1twlVQ==
-----END RSA PRIVATE KEY-----

<强>的Oracle

with t (txt) as 
(
select     '
            select    /* comment /* yada yada yada /* / // bla bla bla  
                        1
                                    */ t1.i
                   ,''"SRC''''"''    as "This''is''the
                                ''source"

            from      t1 /* "Comment 2" - '' */ cross join t2 -- /* comment 3 */

            where     t2.v = ''/*DST"*
                                /'' -- comment 4'
)

select    regexp_replace (txt,'(''.*?''|".*?")|/\*.*?\*/|--.*?(?=[\r\n]|$)','\1',1,0,'n')     as clean_txt

from      t
;

结果

with t (txt) as 
(
select     '
            select    /* comment /* yada yada yada /* / // bla bla bla  
                        1
                                    */ t1.i
                   ,''"SRC''''"''    as "This''is''the
                                ''source"

            from      t1 /* "Comment 2" - '' */ cross join t2 -- /* comment 3 */

            where     t2.v = ''/*DST"*
                                /'' -- comment 4'

from        dual
)

select    regexp_replace (txt,'(''.*?''|".*?")|/\*.*?\*/|--.*?(?=$|\Z)','\1',1,0,'nm')

from      t
;