2017-08-31 141 views
-1

我必須從sql中獲取表名和列名。爲此,我從基於空間的子句數據中分離出來並將所有元素存儲在列表中,但是現在一些列中有方法調用或其他驗證。基於特殊字符的子串

對於離一些列:

  • max(TableName1.ColumnName1) - >TableName1.ColumnName1
  • concat('Q',TableName2.ColumnName2)} - >TableName2.ColumnName2
  • left(convert(varchar(90),TableName3.ColumnName3),1)}) - >TableName3.ColumnName3

現在我證實它們是具有串
在這裏,我只有暗示即()基於此我必須得到左/右字符串/特殊字符之前。

可能得到特殊字符,如,()

+0

正則表達式例子下面貼 - 它比解析字符串簡單。 – Assafs

+1

Yeahhhh ...我檢查過它,它的工作 – Rao

回答

-1

可以使用正則表達式像[(),{}]分裂陣列成標記,然後只需使用「」來選擇令牌。登錄吧。例如:

public static String getColumnName (String input) { 
    if (StringUtils.isEmpty(input)) return input; 
    String[] tokens = input.split("[(),{}]"); 
    for (String token: tokens) { 
     if (token.contains(".")) return token; 
    } 
    return input; 
} 
public static void main(String args[]) throws Exception { 
    //The two tokens will be "max", "TableName1.ColumnName1". 
    String test1 = "max(TableName1.ColumnName1)"; 

    //The three tokens will be "concat", "Q" and "TableName2.ColumnName2". 
    String test2 = "concat('Q',TableName2.ColumnName2)}"; 

    //The six tokens will be "left", "convert", "varchar", 
    //"90", "", "1" and "TableName3.ColumnName3". 
    String test3 = "left(convert(varchar(90),TableName3.ColumnName3),1)})"; 

    System.out.println(getColumnName(test1)); 
    System.out.println(getColumnName(test2)); 
    System.out.println(getColumnName(test3)); 
} 

打印出來給你:

TableName1.ColumnName1 
TableName2.ColumnName2 
TableName3.ColumnName3 
2
import java.util.*; 
import java.text.*; 
import java.util.regex.*; 

public class Parser { 

    private static Pattern p = Pattern.compile("(?![\\(\\,])([^\\(\\)\\,]*\\.[^\\(\\)\\,]+)(?=[\\)\\,])"); 

    private static String getColumnName(String s) { 
     Matcher m = p.matcher(s); 
     while(m.find()) { 
      return m.group(1); 
     } 
     return ""; 
    } 

    public static void main(String []args) { 
     String s1= "max(TableName1.ColumnName1)"; 
     System.out.println(getColumnName(s1)); 

     String s2= "concat('Q',TableName2.ColumnName2)}"; 
     System.out.println(getColumnName(s2)); 

     String s3= "left(convert(varchar(90),TableName3.ColumnName3),1)})"; 
     System.out.println(getColumnName(s3)); 
    } 
} 

輸出:

TableName1.ColumnName1                                                     
TableName2.ColumnName2                                                     
TableName3.ColumnName3