我想在字符串中找到「select from where」序列。例如,正則表達式匹配「select ... from ... where」sql查詢
"select * from T WHERE t.c1 =1"
應匹配。
這裏是正則表達式模式我寫道:
"SELECT\s\.*FROM\s\.*WHERE\s\.*";
但它不工作。它有什麼問題?
我想在字符串中找到「select from where」序列。例如,正則表達式匹配「select ... from ... where」sql查詢
"select * from T WHERE t.c1 =1"
應匹配。
這裏是正則表達式模式我寫道:
"SELECT\s\.*FROM\s\.*WHERE\s\.*";
但它不工作。它有什麼問題?
你不應該有反斜槓逃脫的點;既然你做了,引擎正在試圖匹配一個字面點,而不是像你所期望的那樣「任何字符」。
嘗試:
SELECT\s.*FROM\s.*WHERE\s.*
而且,由於其他人發佈,請確保它在不區分大小寫模式。你如何做到這一點取決於你使用的語言。
我不知道你的目標是什麼正則表達式引擎,但你可以試試這個:與RE
# 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
的一個問題是,它是區分大小寫的。根據RE的形式,可能會有一個標誌來指定不區分大小寫的匹配。例如,Perl兼容的RE使用 「/我」 標誌:/SELECT\s.*FROM\s.*WHERE\s.*/i
假設:
這適用於我。
的Java轉義版本:
String regex = "SELECT\\s+?[^\\s]+?\\s+?FROM\\s+?[^\\s]+?\\s+?WHERE.*";
您可以追加終止,而不是*根據您的情況。當然,你必須在不區分大小寫的模式下運行它,或者適當地修改正則表達式。
感謝你們的回覆。我從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)
試試這個正則表達式,我想更嚴格一點與表和列名,也可以考慮使用過濾器(=,< =,> =,<,>和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(.+)"
歡迎來到StackOverflow。我們的社區喜歡的答案不僅表明應該做什麼,而且還有爲什麼。如果你能擴大你的答案,以便其他人可以從你的知識中學習,那將是非常棒的! – vainolo 2017-05-03 20:34:59