使用正则表达式在Java中

问题描述:

我试着解析Java中的SQL表创建脚本解析SQL表定义。使用正则表达式在Java中

伊夫目前得到了以下模式:

Pattern p = Pattern.compile("(.+)([ ]+)(.+)([ ]+)(.+)"); 

即基团的任何字符(列名称),随后是一个或多个空格,随后另一组字符(列型),随后是一个或更多空格,然后是任意数量的字符(即,e不为空等)。

,这是使用下面的代码:

Matcher m = p.matcher(field); 
if(m.find()){ 
    String column = m.group(1).trim(); 
    String type = m.group(3).trim(); 
    String clauses = m.group(5).trim(); 
} 

可是当我运行这:

firstColumn   varchar(4) not null, 

,第一组为:

firstColumn   varchar(4) 

我期望三个提取的字段分别为firstColumn,varchar(4)和not null。

任何想法?

(.+)会消耗尽可能多的。为了使消耗为地,将其更改为(.+?)

尝试是这样的:

String input = "firstColumn   varchar(4) not null,"; 

Pattern p = Pattern.compile("(.+?)\\s+(.+?)\\s+(.*)"); 
Matcher m = p.matcher(input); 

if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
    System.out.println(m.group(3)); 
} 

输出:

firstColumn 
varchar(4) 
not null, 

+0

希望我能+2:无正则表达式,预建的解决方案(尤其是适当的解析器298345)。 –

另一个选项(恕我直言,最好的一个)懒惰匹配指定可以在这个词出现的人物,那就是:

([^ ]+)([ ]+)([^ ]+)([ ]+)(.+)([ ]+) 

不同的是,虽然这种做法会不会把空格columnName,慵懒的比赛仍然可能,如果该模式的其余部分失败,回溯。

BTW,数据类型仍然可以包含空格(如:CHAR(20) CHARACTER SET xxxxx,也可以括号间隔),所以这种方法是不是真的去上班。