Java Extract通过正则表达式连接字符串中的变量
我目前正在从事一个数据挖掘项目。我必须阅读C#源代码,并且必须找到SQL语句连接的地方。我真正想要的是得到连接字符串变量名的名称 例如:Java Extract通过正则表达式连接字符串中的变量,java,regex,Java,Regex,我目前正在从事一个数据挖掘项目。我必须阅读C#源代码,并且必须找到SQL语句连接的地方。我真正想要的是得到连接字符串变量名的名称 例如: stat = "SELECT * FROM CUSTOMER c WHERE c.name ='" + name + "' AND c.address = " + address; 我想提取的是 姓名、地址 这是我通过以下正则表达式实现的: (?<=[\+])\s*(?<=[^\"])(\.|_|[a-zA-Z]|\(\))+(?<=[^\
stat = "SELECT * FROM CUSTOMER c WHERE c.name ='" + name + "' AND c.address = " + address;
我想提取的是
姓名、地址
这是我通过以下正则表达式实现的:
(?<=[\+])\s*(?<=[^\"])(\.|_|[a-zA-Z]|\(\))+(?<=[^\"])\s*(?=\s*\+*)
以下语句不采用名称变量。问题是要从语句中获取所有变量。正则表达式不是可以解决所有问题的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表达式。有什么理由要求您使用正则表达式吗?我认为这不是适合这份工作的工具。你需要一个解析器。我使用正则表达式来降低编码的复杂性,而且我一直在使用SQL解析器,在扫描庞大的代码库时,它们会降低程序的效率。如果你的SQL语句中可以包含加号,然后,你应该考虑使用解析器来解决这个问题。如果你建议一个SQL解析器来解决这个问题,它可能是混乱的。因为在进行数据挖掘时,我们不能期望完整的SQL语句。我们得到stat=stat+,其中t.name+name;就像半个州。因此,许多SQL解析器在输入无效的SQL语句时失败。正则表达式适用于某些类型的作业。但当你试图将它们用于不适合的任务时,你增加了复杂性,而不是减少复杂性。而且真正长的正则表达式包含很多特殊操作符,比如你发布的那个(在所有情况下都不起作用),已经让事情变得更复杂了。最后,我认为您需要一个C#解析器,而不是SQL解析器,因为据我所知,您实际上并不关心字符串文本中的内容。这将在PL-SQL SQL行中失败,该行在字符串“+”中包含+。@IsuruMadusanka Good call。对于选择a+b
之类的操作,它不会失败,但对于选择a+b+c
则会失败。不确定是否有一个简单的方法来解决这个问题。
name
address