gpt4 book ai didi

c# - 使用正则表达式从 SQL 查询中提取表和列

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:15 26 4
gpt4 key购买 nike

我正在尝试为此任务创建一个正则表达式,但除了非常简单的情况外,我真的无法理解对正则表达式的理解:-( :

问题:我有这个(“SQL like”)查询:

SELECT tcmcs003.*, tccom130.nama, tccom705.dsca, tcmcs052.dsca, tccom100.nama
FROM tcmcs003, tccom130,tccom705,tcmcs052,tccom100
WHERE tcmcs003.cadr REFERS TO tccom130
AND tcmcs003.casi REFERS TO tccom705
AND tcmcs003.cprj REFERS TO tcmcs052
AND tcmcs003.bpid REFERS TO tccom100
ORDER BY tcmcs003._index1

我想“提取”所有的表名列名,然后我想简单地向它们添加我的字符​​...例如替换:

 SELECT tcmcs003.*, tccom130.nama

与:

 SELECT tcmcs003XXX.*, tccom130XXX.namaYYY

到目前为止,我拥有的“最佳”正则表达式是:

(?<gselect>SELECT\s+)*(?<tname>\w{5}\d{3})*(?<spaces>[\.\,\s])+(?<colname>\w{4})*

替换模式:

${gselect}${tname}XXX${spaces}${colname}YYY

输出真的很糟糕:-(

SELECT tcmcs003.
m130
.nama
m705
.dsca
s052
.dsca
m100
.nama

FROM
s003
m130
,m705
,s052
,m100

WHER
s003
.cadr
REFE

m130

s003

如何编写正则表达式?
我想重复捕捉类似的东西

[(any string)(table name)(\.a dot or not)(column name)(any string) ] (repeat N times)

编辑

  1. 我正在用 C# 编写

  2. 模式应该更通用一点:\b(tc(?:mcs|com)\d{3}XXX.\w+)\b

从某种意义上说,表名是 5 个字符(第一个始终是 t,后跟 4 个随机字符)后跟 3 个随机数字

表格列是4个随机字符

最佳答案

我不会尝试匹配整个命令,而是单独匹配每个表或列。由于表的名称中包含数字,因此它与其他内容匹配的可能性很小。

  1. 将列名称与:

    匹配
    \b(t\w{4}\d{3}\.\w{4})\b
  2. 匹配表名:

    \b(t\w{4}\d{3})\b

然后,我们可以分别用所需的值替换每个:"$1YYY""$1XXX"。这些模式使用这些结构:

  • \b 匹配单词边界(一侧是字符字符,另一侧不是字符字符)。
  • \w{4} 匹配 4 个字符 ([A-Za-z0-9_])。
  • \d{3} 匹配 3 个数字 ([0-9])。

代码:

string input = @"SELECT tcmcs003.*, tccom130.nama, tccom705.dsca, tcmcs052.dsca, tccom100.nama  
FROM tcmcs003, tccom130,tccom705,tcmcs052,tccom100
WHERE tcmcs003.cadr REFERS TO tccom130
AND tcmcs003.casi REFERS TO tccom705
AND tcmcs003.cprj REFERS TO tcmcs052
AND tcmcs003.bpid REFERS TO tccom100
ORDER BY tcmcs003._index1";

string Pattern1 = @"\b(t\w{4}\d{3}\.\w{4})\b";
string Pattern2 = @"\b(t\w{4}\d{3})\b";
Regex r1 = new Regex(Pattern1);
Regex r2 = new Regex(Pattern2);
string replacement1 = "YYY";
string replacement2 = "XXX";

string result = "";

result = r1.Replace(input, "$1" + replacement1);
result = r2.Replace(result, "$1" + replacement2);

Console.WriteLine(result);

ideone Demo

关于c# - 使用正则表达式从 SQL 查询中提取表和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32903935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com