Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Extract通过正则表达式连接字符串中的变量_Java_Regex - Fatal编程技术网

Java Extract通过正则表达式连接字符串中的变量

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]|\(\))+(?<=[^\

我目前正在从事一个数据挖掘项目。我必须阅读C#源代码,并且必须找到SQL语句连接的地方。我真正想要的是得到连接字符串变量名的名称

例如:

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