Regex help

11/21/2013 11:34 XxharCs#1
Hello!

I am not so good with regular expressions but i still want to learn and understand it correctly :p

I want to regex a SQL statement. I only want that my sql string contains, a SELECT, SHOW and DESCRIBE and of course at the and a ;

i am coding in Java at it looks like this atm:
Code:
...
Pattern p = Pattern.compile("^(SELECT|SHOW|DESCRIBE).*;$");
...
But it doesn´t match correctly ): What am I missing in my regular expression?
11/21/2013 11:41 Schlüsselbein#2
SQL ist keine reguläre Sprache. Benutz einen SQL-Parser.
11/21/2013 11:44 XxharCs#3
Quote:
Originally Posted by Schlüsselbein View Post
Java ist keine reguläre Sprache. Benutz einen SQL-Parser.
Für mein Java Programm will ich die Regular Expression anwenden, deswegen. Ich kann genauso meinen String mit .startsWith() und .endsWith() prüfen aber das ist mir zu unübersichtlich und ist nicht wirklich schön, deswegen will ich regex anwenden

Edit: Und extra eine SqlParser library für meine kleine Methode, will ich auch nicht verwenden:)
11/21/2013 11:53 Schlüsselbein#4
Ich meinte oben SQL statt Java, entschuldige. So gibt meine Aussage oben wieder Sinn.

Wie schon gesagt, kannst du SQL mit Regex nicht zuverlässlich parsen. Wenn du jesiglich prüfen willst, ob der String bestimmte Schlüsselwörter enthält, benutze halt String.contains() o.ä. was Java sicherlich bietet.
11/21/2013 12:52 XxharCs#5
Hmm, egal. Habs mit Regex ganz weggelassen, weil bei längeren Strings dauerts mir zu lang und ist Injection unsicher.

Habs so gelöst (falls jemand das selbe prob hat):
Code:
    public boolean checkSqlString(String input) {
    	
    	String sql = input.toUpperCase();
        
    	if(sql.indexOf(';') != sql.length() - 1) 
    		return false;
        
    	for (String s : notAllowed) {
    		
    		if (sql.contains(s)) 
    			return false;
    	}
        
    	int i = 0;
    	for (String s : allowed) {
    		
    		if (sql.startsWith(s)) 
    			break;
                i++;
    		if (i == allowed.length) 
    			return false;
    		
    	}
        
    	return true;
    }