2015-11-13 17 views
1

我想驗證這兩個簡單的SQL查詢驗證由java的正則表達式簡單的SQL

String sql1 = "select * from table".toLowerCase(); 
String sql2 = "select value from table".toLowerCase(); 

使用這種模式

String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)"; 

然後我打印值

System.out.println(sql1.matches(pattern)); // true 
System.out.println(sql2.matches(pattern)); // false 

第一個是好的,但我在第二個陳述中得到了錯誤。有人可以幫忙嗎?

回答

2

這是因爲你在字符類中放置了明星字符和單詞字符修飾符。

當你想要2個單獨的字,你不應該使用字符類both.Instead您可以使用邏輯OR(|)和捕獲組之間進行選擇,像以下:

(\\*|\\w+) 

還要注意當你將|+放在字符類中時,你的正則表達式引擎將會轉義它們。

另外,如果你想句子的整體,你不需要把所有的話捕獲內group.You可以使用錨^$指定字符串的開始和結束匹配:

"^select\\s(?:\\*|\\w+)\\sfrom\\s\\w+$" 

(?:)是一個沒有捕獲組。

瞭解更多關於正則表達式http://www.regular-expressions.info/

+0

感謝這麼多,問題也解決了感謝教程:) – SaNtoRiaN

+0

@SaNtoRiaN歡迎。 – Kasramvd

0

我認爲這個問題是因爲正則表達式中的+是貪婪的,所以\ w +正在消耗所有的單詞。所以它消耗「價值」,「從」和「表」。你可以把它「偷懶」通過把問號「+」,如:

([\\*|\\w+?]) 
2

你在一組介紹了方括號,下面一行:

String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)"; 

應該是:

String pattern = "(select)(\\s)(\\*|\\w+)(\\s)(from)(\\s\\w+)"; 

方括號+|內部被視爲文字字符:

[\\*|\\w+]表示單個字符,即*,|,+或一個字母。