2017-08-31 100 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