2013-04-02 20 views
2

傳播查找查詢字符串說在Eclipse中打開一個文件具有下列字符串的Eclipse:在多線

$stmt = "select addr from 
     student 
     where id=123"; 

$stmtA = "alter table tablename"; 

$stmtB = " delete from student 
    where school=ABC"; 

$var1 = "This is not a query. 
     Just a string"; 

我需要找到所有的語句,效果student表和學校列。搜索與:

(?s)"(.*?)" 

給我所有的字符串引用和分散在多行。現在我該怎樣增強上述正則表達式來篩選結果,使其確保結果已

1)選擇或更改或插入或刪除的MySQL, 和 2)學生和學校的關鍵字的關鍵詞。

我覺得滿足上述兩個條件,我就可以提取打到學生表和學校專欄的字符串。任何幫助?

回答

2
(?s)".*?(?:select|alter|insert|delete).*?(?:student|school).*?" 

雖然使用[^"]*?代替.*?會也許會更好。

編輯:
讓我們切換到lookaheads因爲他們是有相當保證時,某些情況下(如字符串長度,有一個特殊的字符或smthg)涼爽的工具:

(?s)".*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?" 

好吧,如果你是不感興趣的正則表達式,你可以停在這裏,否則,作爲向前看符號的例子(注:這是比較慢):

(?s)"(?=[^"]*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?" 

如果你有機會獲得原子團,它一直是tter做到這一點(atomic grouping):

(?>select|alter|insert|delete) 

因爲如果用一個詞失敗,第一個字母后進行匹配,它跳過剩下的(他們都有一個不同的第一個字母)。

最後,我想你可以使用if/then/else

(?s)".*?(?:select|alter|insert|delete).*?(?:(student)|school)(?(1).*?school|.*?student).*?" 

或類似的東西。

+0

上述內容是否會返回既有學生也有學校或其中任何一個的字符串? – user1263746

+0

第一個和第二個關鍵字列表的任意組合。 – Loamhoof

+0

我需要確保兩個關鍵字都存在。否則你的答案很酷! – user1263746