我想在字符串中找到一个“从哪里选择”的序列。例如,
"select * from T WHERE t.c1 =1"
应该匹配。
这是我写的正则表达式模式:
"SELECT\s\.*FROM\s\.*WHERE\s\.*";
但它不起作用。这有什么问题?
答案 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)
假设:
这适合我。
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(.+)"