简体   繁体   English

基于特殊字符的子字符串

[英]Substring based on special characters

I have to fetch the tablename and columnnames from a sql. 我必须从sql中获取表名和列名。 For this I had split from clause data based on space and stored all the elements in a list, But now some of the columns having method calling or some other validations. 为此,我从基于空间的子句数据中分离出来并将所有元素存储在一个列表中,但是现在某些列具有方法调用或其他一些验证。

For ex some of columns : 对于某些列:

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

Now I validate strings which are having . 现在,我验证具有的字符串
Here I had only hint ie ( . ) based on this I have to get right and left strings upto/before special characters. 在这里,我只有一个提示,即( )基于此,我必须在特殊字符之前/之前获取左右字符串。

Might get special characters like , ( ) 可能会得到特殊字符,如, ( )

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));
     }
}

Output: 输出:

TableName1.ColumnName1                                                                                                                                                                                                                
TableName2.ColumnName2                                                                                                                                                                                                                
TableName3.ColumnName3  

You can use a regular expression like [(),{}] to split the array into tokens, and then just select the token with the "." 您可以使用[[),{}]之类的正则表达式将数组拆分为标记,然后只需使用“。”选择标记 sign in it. 登录。 For example: 例如:

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));
}

The print out will give you: 打印输出将为您提供:

TableName1.ColumnName1
TableName2.ColumnName2
TableName3.ColumnName3

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM