正则表达式匹配“select ... from ... where”sql查询

时间:2009-10-01 21:46:09

标签: regex

我想在字符串中找到一个“从哪里选择”的序列。例如,

"select * from T WHERE t.c1 =1"

应该匹配。

这是我写的正则表达式模式:

"SELECT\s\.*FROM\s\.*WHERE\s\.*";

但它不起作用。这有什么问题?

6 个答案:

答案 0 :(得分:8)

你不应该有反斜杠逃脱的点;既然你做了,引擎就试图匹配一个字面点,而不是像你期望的那样“任何字符”。

尝试:

SELECT\s.*FROM\s.*WHERE\s.*

此外,正如其他人发布的那样,请确保它处于不区分大小写的模式。你如何做到这取决于你正在使用的语言。

答案 1 :(得分:5)

我不确定你的目标是什么正则表达式引擎,但你可以试试这个:

# note the trailing i, which in perl means case-insensitive
# this will also put the interesting bits into regex backreferences
#
# This also changes \s to \s+ in case you have a situation with multiple
# spaces between terms
#
/select\s+(.*)\s+from\s+(.*)\s+where\s+(.*)/i

答案 2 :(得分:1)

RE的一个问题是它区分大小写。根据RE的形式,可能有一个标志来指定不区分大小写的匹配。例如,Perl兼容的RE使用“/ i”标志:/SELECT\s.*FROM\s.*WHERE\s.*/i

答案 3 :(得分:0)

假设:

  • 您的sql语句不会跨行。
  • 一行上不会有两个sql语句。

这适合我。

SELECT\s+?[^\s]+?\s+?FROM\s+?[^\s]+?\s+?WHERE.*

Java转义版本:

String regex = "SELECT\\s+?[^\\s]+?\\s+?FROM\\s+?[^\\s]+?\\s+?WHERE.*";

根据您的情况,您可以附加终结符而不是。*。当然,您必须在不区分大小写的模式下运行它,或者适当地修改正则表达式。

答案 4 :(得分:0)

谢谢你们的回复。我得到了mmyers的答案,这是我的最终解决方案:

        string szPattern = @"SELECT\s.*FROM\s.*WHERE\s.*";
        Regex  rRegEX = new Regex ( szPattern,RegexOptions.IgnoreCase | RegexOptions.Multiline );
        Match match =rRegEX.Match(testCase.Statement);
        if (match.Success)

答案 5 :(得分:0)

尝试使用此正则表达式,我尝试对表名和列名进行更严格的限制,并考虑使用带(=,< =,> =,<,>和IN())的过滤器:

string regex = "SELECT\W(([a-zA-z0-9]+)([,]*)\W)+\WFROM\W([a-zA-z0-9#]+)(\W[a-zA-Z])*\WWHERE\W([a-zA-z0-9_]+)\W([=<>IN(]+)\W(.+)"