我目前正致力于数据挖掘项目。我必须阅读一个C#源代码,我必须得到一个SQL语句连接的地方。我真正想要的是获取连接字符串变量名称的名称。
示例:
stat = "SELECT * FROM CUSTOMER c WHERE c.name ='" + name + "' AND c.address = " + address;
我想要提取的是
姓名,地址
这是我用以下正则表达式实现的:
(?<=[\+])\s*(?<=[^\"])(\.|_|[a-zA-Z]|\(\))+(?<=[^\"])\s*(?=\s*\+*)
但是在以下情况下会出现问题。
stat = name + "' AND c.address = " + address;
以下语句不带名称变量。问题是从声明中获取所有变量。
答案 0 :(得分:1)
正则表达式不是可以治愈所有困境的pancea,在这种情况下,我相信只需拆分包含查询字符串的代码行就可以获得更好的里程数:
String line = "stat = \"SELECT * FROM CUSTOMER c WHERE c.name ='\" + name + \"' AND c.address = \" + address;";
// spilt on the + symbol, and remove the ending semicolon
String[] parts = line.substring(0, line.length()-1).split("\\+");
for (String part : parts) {
// variables will not be contained in quotation marks
if (!part.contains("\"")) {
System.out.println(part.trim());
}
}
<强>输出:强>
name
address
请注意,您可能需要添加其他逻辑来确定给定的代码行是否包含SQL查询。在这种情况下,您可以尝试类似line.contains("SELECT")
的内容,它将匹配所有SELECT
语句。这可以扩展为匹配您希望在代码中看到的各种SQL表达式。