【问题标题】:Extract tables and columns from SQL query using regular expression使用正则表达式从 SQL 查询中提取表和列
【发布时间】:2015-10-02 09:08:48
【问题描述】:

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

问题:我有这个(“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 个随机字符

【问题讨论】:

  • 类似thisthis ?
  • 网络有点阻塞...
  • @Mariano.. 完美!请回复,以便我投票;-)
  • ehm.. 几个问题,请看我的编辑

标签: c# regex


【解决方案1】:

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

  1. 匹配列名:

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

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

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

  • \b 匹配单词边界(一侧是单词 char,另一侧不是单词 char)。
  • \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

【讨论】:

  • 注意:我使用\w 表示随机字符。它匹配[A-Za-z0-9_]。随意更改它。
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多