wy168 发表于 2022-8-21 12:31:11

c#怎样能写个sql的解析器

<h1 id="8edf06bd-d480-4fe9-aa0c-86d801dbfd94" style="font-size:20px;margin:20px 0px;font-weight:700;">前言</h1><p id="2cab1467-d9f0-43c7-9e88-2c9a7193b75e" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="7950d7ed-ccd6-4571-8416-02558aa22fb3" style="font-size:18px;margin:20px 0px;text-align:left;">阅读本文需要有一定正则表达式基础 正则表达式基础教程 ,和编译原理的基础。有使用过VUE的伙伴可能知道vue是自定了模版解析编译器的,vue用的是标准的AST语法树统计,如果对语法树不了了解的请查看 什么是AST抽像语法树</span></p><p id="d6ba889c-eb10-4776-b4d4-62a358d6fe19" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="f15c6591-500e-4b1d-9ce5-5f96cf196843" style="font-size:18px;margin:20px 0px;text-align:left;">本示例介绍的是参考编译原理 词法分析-&gt;语法分析-&gt;构建AST语法树-&gt;解析成目标sql 的流程来实现</span></p><h1 id="8f5ecebb-ceb6-4ef4-a86e-5abe4c68f4ab" style="font-size:20px;margin:20px 0px;font-weight:700;">示例</h1><p id="10f4e8b3-99ba-44db-8133-aabc89b30527" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="5739a6bb-e393-4a60-ab8c-316d7a6933b3" style="font-size:18px;margin:20px 0px;text-align:left;">sqlserver 的一条查询语句</span></p><pre id="34658d8a-740b-4f5c-b527-a3d540a663d0" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="5d106909-3aee-475d-a7f4-099bcd1a5a1a" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="76189e86-44b9-4f5c-82c3-ad3d199631f6" style="font-size:18px;margin:20px 0px;text-align:left;">select</span>a.UniqueCode,a.BarCode,a.CategoryId<span id="5bb2fc83-2a34-415e-a5d3-1da6dacf5c1e" style="font-size:18px;margin:20px 0px;text-align:left;">from</span>GD_UniqueCodeInfo<span id="1b11805d-6f32-4258-90da-1bee4cacc608" style="font-size:18px;margin:20px 0px;text-align:left;">as</span>a</code></pre><p id="84262c4b-25a5-444c-9643-7c1878f83852" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="26df23f1-8dd8-40e8-901c-648eb08dc89a" style="font-size:18px;margin:20px 0px;text-align:left;">假如我们要将以上代码进行格式化成以下方式</span></p><pre id="e8388464-f0f5-4703-9f66-48f4f910be9e" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="3251f897-24f8-4f80-921f-74a13a84798f" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="8322b6d0-6471-4d80-bec4-4fb55d60e0b1" style="font-size:18px;margin:20px 0px;text-align:left;">select</span><span id="864d91fb-dc5a-4bcc-84f9-980e285489a6" style="font-size:18px;margin:20px 0px;text-align:left;"></span>.<span id="f6829ed1-efb8-45df-af9b-b5157b9c80a9" style="font-size:18px;margin:20px 0px;text-align:left;"></span>,<span id="2da734bd-ecb7-4f67-8469-d3917b7fd68d" style="font-size:18px;margin:20px 0px;text-align:left;"></span>.<span id="4f8e57c1-38ab-4938-ac78-bbc57a6258a2" style="font-size:18px;margin:20px 0px;text-align:left;"></span>,<span id="69b61b42-9370-4d37-8dc4-39479a13e31d" style="font-size:18px;margin:20px 0px;text-align:left;"></span>.<span id="5dc1d2b2-4369-4766-a35d-5981c5f0eec5" style="font-size:18px;margin:20px 0px;text-align:left;"></span><span id="ed3adb8b-3eb6-4cb4-88c0-3f04ac4e8318" style="font-size:18px;margin:20px 0px;text-align:left;">from</span><span id="e6dba740-236a-42d9-a106-09c4cf2e5d6b" style="font-size:18px;margin:20px 0px;text-align:left;"></span><span id="a585c208-2bae-42c4-aafb-c9555f8e05e7" style="font-size:18px;margin:20px 0px;text-align:left;">as</span><span id="7812c328-7a85-4c88-a747-25b8fbe0a4b6" style="font-size:18px;margin:20px 0px;text-align:left;"></span></code></pre><h1 id="e58f72b0-d955-4f8b-aa52-389109968daf" style="font-size:20px;margin:20px 0px;font-weight:700;">分析</h1><p id="c7b089f6-17a5-4d2a-bcd7-aac1d6318e93" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="76286089-f73d-4e43-b249-ac7bed22f3ad" style="font-size:18px;margin:20px 0px;text-align:left;">首先我们来分析一下这个语句有什么特点。</span></p><ol id="473c07ed-83fd-49d6-8333-4608abdf83d1" style="font-size:18px;margin:20px 0px;text-align:left;"><li id="bfc286ad-5d3a-4ea2-97ff-40cceb8ee718" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="a8f3687e-1b23-4da3-bee9-af3aee83ead4" style="font-size:18px;margin:20px 0px;text-align:left;">找关键词这个sql语法有三个关键词如</span><span id="69677c68-2101-4852-a381-6a0281b99f91" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="a6ebfc6d-686f-449f-a8c8-3b72aee6b9dc" style="font-size:18px;margin:20px 0px;text-align:left;">select</span></span>,<span id="0584926b-7c0a-4ae8-a4cb-3d689f462543" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="dc0c4cc1-1415-496f-b929-f44a636816d5" style="font-size:18px;margin:20px 0px;text-align:left;">from</span></span>,<span id="eab76fea-5663-42c4-a55d-2a5aec0715d2" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="cd2c5bba-95ef-436a-b5ab-485b5ad56a46" style="font-size:18px;margin:20px 0px;text-align:left;">as</span></span></li><li id="61cc8f7e-c4e8-421d-bd2b-b745cb26fb9e" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="b3e01896-6873-435a-ad60-dc5b141606fa" style="font-size:18px;margin:20px 0px;text-align:left;">找结构有字段信息</span><span id="939e0b98-5932-46f9-bb06-e7a7f1a4c6dc" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="918564fd-0f89-4cc3-959c-a0248f8f42c0" style="font-size:18px;margin:20px 0px;text-align:left;">a.UniqueCode,a.BarCode,a.CategoryId</span></span>,有表名信息<span id="afc7cfdd-44c2-457a-a345-1cc9fa3b664d" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="51324217-fc40-40da-94e2-5f58f9248c9f" style="font-size:18px;margin:20px 0px;text-align:left;">GD_UniqueCodeInfo</span></span>还有 重命名的表信息<span id="2a30eccb-25e5-43fa-996a-16dc17ffec5f" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="dabd4ccd-d1de-4ecb-93c5-a6bd2d949184" style="font-size:18px;margin:20px 0px;text-align:left;">a</span></span>这些信息可能符合命名规范可能有些不符合,那么在解析时都要进行检测出来</li><li id="2c605e96-901b-428a-8d46-5a9f50c61a50" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="6341095b-511e-4a1c-a530-1fe6fb6aeba1" style="font-size:18px;margin:20px 0px;text-align:left;">标识符在生成的目标sql语句中有[] 这个的作用主要是万一字段名称出现与关键词有相同的字段名称能进行正常识别</span></li></ol><h1 id="a348a961-5d30-497a-9f4d-09d403bbc00b" style="font-size:20px;margin:20px 0px;font-weight:700;">开始</h1><p id="3f494d23-64a8-443f-8c0c-6cbc77ac149c" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="b18bfde0-f5a7-46e4-bd08-daf27c3d8065" style="font-size:18px;margin:20px 0px;text-align:left;">首先我们先创建两个c解析正则表达式的方法</span></p><p id="49f2e9fc-64c9-4a33-b086-bd778fba9af2" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="7607b669-359d-449a-a749-127fe7359e25" style="font-size:18px;margin:20px 0px;text-align:left;">这个方法就是可以将正则表达式中的匹配数据提出来返回一个字典数据</span></p><pre id="9641a2a7-32b9-4517-8737-b2ecf7d584cb" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="0ca468aa-7ad7-42b2-9069-04b7e095ee9b" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="d8328c3b-d17b-4ed4-946a-b2519328597b" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="7cb378bc-19e3-4662-8f3c-7aa57bfa5106" style="font-size:18px;margin:20px 0px;text-align:left;">public</span><span id="8306e417-620a-4297-a7bf-854e9f58de60" style="font-size:18px;margin:20px 0px;text-align:left;">static</span>Dictionary&lt;<span id="e3f80ed6-ef43-4b42-8363-0ae9b4ed27e5" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>,<span id="f938b25b-fec0-4519-8c55-8f2cfec58052" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>&gt;<span id="b18262ec-01a3-481a-a5d8-96d52123c3ef" style="font-size:18px;margin:20px 0px;text-align:left;">RegexGrp</span>(<span id="1cd047eb-cf7b-48e0-9c34-cb48d34fb267" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="520469b3-9645-4158-9b51-256e1dd3dc8b" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>regex,<span id="3f9a783e-f98a-4bc4-93a5-680479240ce3" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>text</span>)</span>{      Regex _regex =<span id="b79c3988-22f3-4cdc-8606-eb1edd4f86a3" style="font-size:18px;margin:20px 0px;text-align:left;">new</span>Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Multiline);      Dictionary&lt;<span id="063f30ee-61f0-4508-b2a5-cded02259c69" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>,<span id="0e395af1-fa1e-481e-a470-a37ba4384a28" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>&gt; _dic =<span id="3a3859d8-9dac-47d6-b429-d365e1b18fb4" style="font-size:18px;margin:20px 0px;text-align:left;">new</span>Dictionary&lt;<span id="41398287-777d-4d6c-b01f-7ad9628a52f6" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>,<span id="30d80273-13f1-4eaf-bc70-247276ce5258" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>&gt;();      Match _match = _regex.Match(text);<span id="d2345ad0-78a5-413e-b28e-fff073ca94f9" style="font-size:18px;margin:20px 0px;text-align:left;">while</span>(_match.Success)      {<span id="08ddc737-5a7b-40b6-addf-1b2e40a53003" style="font-size:18px;margin:20px 0px;text-align:left;">foreach</span>(<span id="53cbe890-3be0-4be3-905f-cce1d6462a75" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>name<span id="833725ea-5f68-48e7-bf91-f29fed1c9648" style="font-size:18px;margin:20px 0px;text-align:left;">in</span>_regex.GetGroupNames())            {<span id="daf19880-c244-46db-be7e-ace31ff99d30" style="font-size:18px;margin:20px 0px;text-align:left;">if</span>(!_dic.ContainsKey(name))                  _dic.Add(name, _match.Groups.Value);            }            _match = _match.NextMatch();      }<span id="1d234648-ed4c-488f-b766-5b2402b4e042" style="font-size:18px;margin:20px 0px;text-align:left;">return</span>_dic;}</code></pre><p id="29ddf95b-5f96-4570-b692-ff550f91fdc7" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="5678f405-7ea5-43d7-9369-03d426ec8a10" style="font-size:18px;margin:20px 0px;text-align:left;">检测正则表达工是否正确匹配</span></p><pre id="16056903-b89e-41ff-898d-c5f79f6e00ce" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="d4b245f1-a4fa-410c-9953-4843154f5899" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="4da570a5-f1cd-449e-b28d-8e7fcd2881d8" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="32a3b703-1a28-459a-a911-d07b41107b1e" style="font-size:18px;margin:20px 0px;text-align:left;">public</span><span id="9b0d0969-88be-4097-8453-94048d0d2810" style="font-size:18px;margin:20px 0px;text-align:left;">static</span><span id="660afbb4-619f-4b09-be67-f2a2b3779c4d" style="font-size:18px;margin:20px 0px;text-align:left;">bool</span><span id="403e3abe-68af-4bb9-bd93-8bf722bbe00b" style="font-size:18px;margin:20px 0px;text-align:left;">RegexMatch</span><span id="4cc308e7-b2a8-4df2-897c-fcca1daeaeae" style="font-size:18px;margin:20px 0px;text-align:left;">(<span id="f548d0f2-1ef7-40b9-97fc-6a92add7bb9d" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>regex,<span id="948d942f-7f14-42d9-8dcc-660a43686a92" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>text)</span></span>{            Regex _regex =<span id="e10c4268-d0ac-4b38-afbe-7b8ea9214229" style="font-size:18px;margin:20px 0px;text-align:left;">new</span>Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Multiline);            Match _match = _regex.Match(text);<span id="5cbdf812-82a1-44ad-9f27-051b67982532" style="font-size:18px;margin:20px 0px;text-align:left;">return</span>_match.Success;      }</code></pre><h1 id="15fde9ee-9c53-491a-9e68-2b4f4475a120" style="font-size:20px;margin:20px 0px;font-weight:700;">第一步 先检测这个sql语句是否是一个查询语句</h1><p id="233071c5-c08c-4830-b331-2545df6b1a5b" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="84367bd0-acfe-4814-a114-2f9d92789ee5" style="font-size:18px;margin:20px 0px;text-align:left;">正则代码:</span><span id="3e51b49c-bc70-446f-80bf-5a35a9beb2f2" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="314aca81-c5d2-489e-b580-e67605827bcd" style="font-size:18px;margin:20px 0px;text-align:left;">^\s*(?<cmd>select)\s+(?<field>[\w\s\S]+(?=\bfrom\b))(?:\bfrom\b)(?<from>(?:[\s]+)(?<flag>[\]{1,2}|[\@]{1})?(?<tab>[\w]+)\s*[\s\w\S]*)</tab></flag></from></field></cmd></span></span></p><p id="808100ff-a4be-43f7-a648-4c9c4af29e86" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="e06bbfa5-c98f-487a-923a-91525e26b80b" style="font-size:18px;margin:20px 0px;text-align:left;">那么我们来验证下通过把要解析的SQL语句放入测试工具中运行</span></p><div id="0c3613b3-0186-4d99-869e-b9bfbb01f925" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/c58654ce74b0431c9d71a0d36908e0aa~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=2uQhoqLQhj7OlYFtJjKMukurQKc%3D" style="width:100%;"></div><p id="7a6ae8b9-2686-44d1-9702-99588a65e6ba" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="5b878b99-4621-45f2-9eb3-ca620acb138c" style="font-size:18px;margin:20px 0px;text-align:left;">在右下方的区域通过正则匹配已经把该语句结构已经拆解出来了cmd:</span><span id="14bb32b9-b63a-4afa-98c0-9da5c52eed48" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="37f12d78-a1bf-4560-bf16-752adb37c38e" style="font-size:18px;margin:20px 0px;text-align:left;">select</span></span>field:<span id="e4aebbc2-b32f-43b2-95ed-88b0a25d318e" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="030e7cf8-be71-479c-832b-a521c2ded4b7" style="font-size:18px;margin:20px 0px;text-align:left;">a.UniqueCode,a.BarCode,a.CategoryId</span></span>tab:<span id="e99d684a-b511-4cad-bb3e-26e51414469d" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="d7961127-3d55-4161-8d30-ff80635abfb1" style="font-size:18px;margin:20px 0px;text-align:left;">GD_UniqueCodeInfo</span></span></p><p id="ec7788dd-6869-4b55-88f4-efa5074b6f9c" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="ac0a9f01-78c4-4e83-98b4-15725acb294c" style="font-size:18px;margin:20px 0px;text-align:left;">一下就把SQL语句结构化出来了,有匹配结果说明是一个正常的sql语句</span></p><h1 id="41dc909b-f431-45e5-83c5-d186dce12318" style="font-size:20px;margin:20px 0px;font-weight:700;">第二步 通过代码获取结构信息</h1><pre id="b08fe70e-4f79-4a66-8010-8321b5d19d02" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="43a5ef75-748c-4ec0-8b96-512d5f63df78" style="font-size:18px;margin:20px 0px;text-align:left;">string sql="<span id="afb368d4-771d-43e7-9b1f-d6e0a9804233" style="font-size:18px;margin:20px 0px;text-align:left;">select</span>a.UniqueCode,a.BarCode,a.CategoryId<span id="29593642-84c2-4420-ac13-cceebda04b60" style="font-size:18px;margin:20px 0px;text-align:left;">from</span>GD_UniqueCodeInfo<span id="447931a2-6213-4f73-ade0-a02bc987a61c" style="font-size:18px;margin:20px 0px;text-align:left;">as</span>a<span id="557817d8-2b5b-4e2b-a8e9-cae6d8399769" style="font-size:18px;margin:20px 0px;text-align:left;">";Dictionary<string, string=""> dic =RegexGrp(@"</string,></span>^\s*(?<cmd><span id="f8ea19bd-538d-434b-8e46-9d04b50e4ed6" style="font-size:18px;margin:20px 0px;text-align:left;">select</span>)\s+(?&lt;<span id="8a71022f-9499-4b38-a21a-327cc598e96a" style="font-size:18px;margin:20px 0px;text-align:left;">field</span>&gt;[\w\s\S]+(?=\bfrom\b))(?:\bfrom\b)(?&lt;<span id="ffcb61f4-a3c1-403f-b6df-237370fd0a74" style="font-size:18px;margin:20px 0px;text-align:left;">from</span>&gt;(?:[\s]+)(?<flag>[\<span id="8615e29c-df81-45f1-b66d-dffb4bb461fa" style="font-size:18px;margin:20px 0px;text-align:left;">]{1,2}|[\@]{1})?(?<tab>[\w]+)\s*[\s\w\S]*)",sql);if(dic.ConstainsKey("cmd")){    // 说明匹配成功    Console.Write(dic["cmd"]);      }</tab></span></flag></cmd></code></pre><p id="ff1226f1-904a-48e2-a13a-4d2580e3c8ec" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="377edd9b-0a60-4975-93e8-91a0738b7b5b" style="font-size:18px;margin:20px 0px;text-align:left;">拆解select 后要把select 替换为空剩余的sql 为</span><span id="72d9be53-8cb3-4e03-a26e-85aa3e8c9fd0" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="dab41dc3-0a93-45d1-b094-1bfa66d5fb88" style="font-size:18px;margin:20px 0px;text-align:left;">a.UniqueCode,a.BarCode,a.CategoryId from GD_UniqueCodeInfo as a</span></span></p><h1 id="0bc45677-6dbf-4f68-9725-a76da91f8de1" style="font-size:20px;margin:20px 0px;font-weight:700;">第三步 拆解字段</h1><p id="def940b0-1551-43db-bc65-9a72bef911a4" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="82e120fb-a7fd-41df-be7b-5fd4dc2e5c87" style="font-size:18px;margin:20px 0px;text-align:left;">正则表达式:</span><span id="3a0f4a89-051b-4355-ac1a-5fbfb6b7c917" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="b09c820b-846a-48f5-8866-49b41bc7b341" style="font-size:18px;margin:20px 0px;text-align:left;">^\s*(?<field>[\w\s\S]*?(?=\bfrom\b))</field></span></span>两人通过测试工具测试一下</p><div id="312036e2-3afc-4e34-8b02-3abc2256a07a" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/0ce3fd3352a8490d97d332bd17c8ebb2~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=gvwJT8rAQGdjdvTLrJMHh48Xvi4%3D" style="width:100%;"></div><p id="8ad9f0cc-86e2-4e95-b19d-0a6f0d2d0ff8" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="d0e6ce9a-0b0f-4a44-8a80-c85b3dbe5b34" style="font-size:18px;margin:20px 0px;text-align:left;">那么就可以通过代码获取出来</span></p><pre id="8ecef3f8-dc38-49d6-82fd-3d72bb62a8ad" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="1427cb7b-b7b0-4158-aef0-0df18df6e919" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="81a455da-e371-4dca-927e-83bedecfc71c" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>sql=<span id="f98d40e3-3439-4861-be4b-b76ce3aaf29a" style="font-size:18px;margin:20px 0px;text-align:left;">"a.UniqueCode,a.BarCode,a.CategoryId from GD_UniqueCodeInfo as a"</span>;Dictionary&lt;<span id="68f89c70-51cd-4ec7-ae17-ff69c224e3e2" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>,<span id="62d64ce0-3091-4a30-8ba7-5d3c01dc3e27" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>&gt; dic =RegexGrp(@<span id="50161943-1f25-4ad9-b7b7-28e03c75dcd3" style="font-size:18px;margin:20px 0px;text-align:left;">"^\s*(?<field>[\w\s\S]*?(?=\bfrom\b))"</field></span>,sql);<span id="29c4d950-9b23-4410-99c3-0442843eff6e" style="font-size:18px;margin:20px 0px;text-align:left;">if</span>(dic.ContainsKey(<span id="a21c5118-e6d2-4d6d-a21d-30ba32e81827" style="font-size:18px;margin:20px 0px;text-align:left;">"field"</span>)){<span id="3a9dfcd5-f255-46bc-8d9b-3a8ce853774f" style="font-size:18px;margin:20px 0px;text-align:left;">//说明匹配成功   }</span></code></pre><p id="7f93b08a-0b6b-4868-806b-d22274947d1a" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="982575b9-ca8e-43e4-9620-f31bdb8859ef" style="font-size:18px;margin:20px 0px;text-align:left;">字段是有多个的 还要单独拆解成一个一个的字段,拆解字段的这个就不详细描述了,可以继续用正则表达式也可以用Split(,) 进行分拆如</span></p><pre id="6d99f017-6dec-44f0-80e6-5477029924ad" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="ff133744-3d29-49cc-a2d4-3cfc6e850501" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="542d1397-c4c3-40ed-a998-05ce70e63902" style="font-size:18px;margin:20px 0px;text-align:left;">var</span>_field=dic[<span id="aef9041d-f58d-41b4-8b69-f34d3fd5b53d" style="font-size:18px;margin:20px 0px;text-align:left;">"field"</span>];<span id="b056bf16-0943-4682-8f2f-681e732b16e8" style="font-size:18px;margin:20px 0px;text-align:left;">var</span>fields=_field.Split(<span id="484de98f-01d9-4649-a5ab-66594d22540e" style="font-size:18px;margin:20px 0px;text-align:left;">,</span>)</code></pre><p id="6611fc85-3733-41e4-8e67-6c3adb7d3170" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="0095f2e9-d8f2-4c8c-9b56-aeb50ddac90a" style="font-size:18px;margin:20px 0px;text-align:left;">拆解完字段后 剩余的sql:</span><span id="384d1d6b-84bb-49c0-840a-5c0bc5fec289" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="bf48cb65-942e-4609-9a7e-9bb09e19b0bd" style="font-size:18px;margin:20px 0px;text-align:left;">from GD_UniqueCodeInfo as a</span></span></p><h1 id="439075a1-67dc-40b3-871b-348e7b4cd530" style="font-size:20px;margin:20px 0px;font-weight:700;">拆解from</h1><p id="ca2faab3-0687-4f23-9320-3f342e82f495" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="c9defe6f-aa77-413e-aab3-fd0299483124" style="font-size:18px;margin:20px 0px;text-align:left;">正则表达式:</span><span id="a32d412a-00cb-461f-8ed9-5c1c316b9be5" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="b95eb5a3-2ab3-4a73-bc2c-2ad6f3fb5458" style="font-size:18px;margin:20px 0px;text-align:left;">^\s*(?:\bfrom\b)(?<from>(?:[\s]+)(?(?:[\s]*)(?<flag>[\]{1,2}|[\@]{1})?(?<tab>[\w]+))\s*(?:\bas\b\s*(?<asname>[\w]+))?\s*)通过该正则表达式可以拆解出 通过 as 重命名的表下面通过正则表达式工具测试一下<p></p><div id="f3e27bd9-5a38-4108-8696-ba8df53c4f5b" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/1e8288338bbb48e889288baaa99f179e~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=sKc4XYXskKsZUdFxI9GH5i3yuR4%3D" style="width:100%;"></div><p id="c5f7aa51-c9f6-4bd9-a628-7438d0d4090c" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="093b6ef9-cbbd-4f5e-89ba-1c557aea05c1" style="font-size:18px;margin:20px 0px;text-align:left;">那么通过以下代码来获取</span></p><pre id="e307df7b-e9de-4dbc-81c2-ea01f8bca185" style="font-size:18px;margin:20px 0px;text-align:left;"><code id="c569f77c-c6ec-4a13-9989-a6237814122c" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="82e27f6c-4f2d-4887-9e0f-fd51dd9574d9" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>sql=<span id="6464ea08-af02-48a9-bd31-f17e5cfc116b" style="font-size:18px;margin:20px 0px;text-align:left;">"from GD_UniqueCodeInfo as a"</span>;Dictionary&lt;<span id="d3009323-b88c-4a22-adc8-7d87e16907a8" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>,<span id="e612388e-4e31-492e-8b53-811e43cb5db1" style="font-size:18px;margin:20px 0px;text-align:left;">string</span>&gt; dic =RegexGrp(@<span id="af2ef3b9-0bf0-46e1-b6c1-26200225cb71" style="font-size:18px;margin:20px 0px;text-align:left;">"^\s*(?:\bfrom\b)(?<from>(?:[\s]+)(?</from></span></code></pre></asname></tab></flag><table></table><code id="c569f77c-c6ec-4a13-9989-a6237814122c" style="font-size:18px;margin:20px 0px;text-align:left;">(?:[\s]*)(?<flag>[\]{1,2}|[\@]{1})?(?<tab>[\w]+))\s*(?:\bas\b\s*(?<asname>[\w]+))?\s*)",sql);<span id="ff46c409-f889-433c-842b-d191e01f5e9a" style="font-size:18px;margin:20px 0px;text-align:left;">if</span>(dic.ContainsKey(<span id="0944974b-5586-498b-ba39-9c008b485ec7" style="font-size:18px;margin:20px 0px;text-align:left;">"tab"</span>)){<span id="c3f758b2-0d62-4063-84da-a61e3ace0a13" style="font-size:18px;margin:20px 0px;text-align:left;">//说明匹配成功   }</span></asname></tab></flag></code><p id="204f4385-0a16-424a-aab1-31939ee991ff" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="94974e6b-c173-4b79-b4e3-2777b7c73782" style="font-size:18px;margin:20px 0px;text-align:left;">此时 就算通过正则表达式拆解完成,但还需要对它进行结构化</span></p><p id="5a73a19b-2e9c-45a3-8b47-ce23476ca41d" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="c8260387-3c25-479c-a9a7-c74bd3c0608a" style="font-size:18px;margin:20px 0px;text-align:left;">以下是代码截图片段</span></p><div id="86e220ce-b61f-49b3-9aa8-20c97ac4c766" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/069a9623959741b0adde24e43372235d~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=34uxjMeXY0NggTcR73AIbhjm04M%3D" style="width:100%;"></div><div id="43346430-108f-4054-88d3-16dfb5af6d15" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/6e0911d385ad4b2baea0f4edf035ac9b~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=18XRr0ao3vDCkEHAG9RfaRIq36Q%3D" style="width:100%;"></div><div id="66b50b6a-0461-49ef-8f3b-c33ae2d8c6d3" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/45310ee82bc74b33957bcf7b47bb6707~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=2lYNAjnyx1tJ5cweFB%2B%2FFRMwHHQ%3D" style="width:100%;"></div><p id="6698b965-0901-4b40-8197-b2d10fe40706" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="da9ecbff-1a66-41b6-b434-1c348029ecf6" style="font-size:18px;margin:20px 0px;text-align:left;">结果</span></p><div id="a0bd58b2-1cf4-4155-b665-5804f0b3075c" style="font-size:18px;margin:20px 0px;text-align:left;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/4b7843a729344bd195244ac6215a9a33~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1660438860&amp;x-signature=btHbdEecZaO9po3ThUZKxTZuZuw%3D" style="width:100%;"></div><p id="3fa11cbe-aee0-48ab-acf6-734c022f8f51" style="font-weight:400;text-align:left;line-height:1.667;margin:20px 0px;font-size:18px;"><span id="afdaa5f4-c2bc-489e-9a72-d6653eed5437" style="font-size:18px;margin:20px 0px;text-align:left;"><span id="31ff5bb3-889a-416c-8e56-17f7a19afb18" style="font-size:18px;margin:20px 0px;text-align:left;">请查看demo代码:https://gitee.com/dotnetlowcode/hisql/blob/master/HiSql.SqlServerUnitTest/Demo_Query.cs</span></span></p><table></table></from></span></span></p>
页: [1]
查看完整版本: c#怎样能写个sql的解析器