使用正则表达式在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,
答
另一个选项(恕我直言,最好的一个)懒惰匹配指定可以在这个词出现的人物,那就是:
([^ ]+)([ ]+)([^ ]+)([ ]+)(.+)([ ]+)
不同的是,虽然这种做法会不会把空格columnName
,慵懒的比赛仍然可能,如果该模式的其余部分失败,回溯。
BTW,数据类型仍然可以包含空格(如:CHAR(20) CHARACTER SET xxxxx
,也可以括号间隔),所以这种方法是不是真的去上班。
希望我能+2:无正则表达式,预建的解决方案(尤其是适当的解析器298345)。 –