在撰寫或分析 T-SQL 程式碼時,經常需要識別並提取註釋。然而,單純使用 -- 開頭的模式容易誤匹配字串常值內的雙連字號,導致結果不準確。本文將逐步演示如何構建一個健壯的正則表達式,精準匹配 T-SQL 中的單行註釋。
考慮以下四個 SQL 片段:
-- 獲取表的 count 信息
select count(*) from T with(nolock)
-- 獲取特定值的 count 信息
select count(*) from T with(nolock)
where v = '--value'
-- 獲取表 'T' 的 count 信息
select count(*) from T with(nolock)
SELECT * from T -- 獲取表 T
Where P
--[^\r\n]*$此模式能匹配以 -- 開頭直到行尾的內容,但會錯誤匹配第二條 SQL 中字串 '--value' 內的部分。
--[^'\r\n]{0,}$加入單引號排除後,第二條 SQL 不再匹配,但第三條 SQL 中合法的註釋 -- 獲取表 'T' 的 count 信息 也因包含單引號而漏匹配。
分析 T-SQL 註釋特徵:
-- 開頭。'...' 內部。--([^'\r\n]{0,}(?'[^'\r\n]{0,}'){0,1}[^'\r\n]{0,}){0,}$
--:匹配註釋起始標記。[^'\r\n]{0,}:匹配非單引號、非換行的任意字元(註釋前的程式碼或註釋開頭)。(?'[^'\r\n]{0,}'){0,1}:可選匹配一對完整的單引號包裹的字串常值(允許註釋前有字串常值)。[^'\r\n]{0,}:匹配字串常值後剩餘的非單引號字元(即真正的註釋內容)。{0,}$:整個群組可重複零次或多次,確保匹配到行尾。該正則成功匹配所有四條 SQL 的註釋部分,且不誤匹配字串常值內的 --。
若行尾存在單獨的單引號(未成對),可能導致匹配異常。但在實際開發中,字串常值幾乎總是成對出現,此問題可忽略。
透過對語言語法特徵的深入分析,構建出兼顧準確性與容錯性的正則表達式,能有效解決 T-SQL 註釋提取難題。正則表達式雖強大,但需結合具體語境精心設計。