java正则挖取建表语句

forever_1123 2012-07-31 11:28:49
java正则挖取建表语句:
-------------------------------------------------
-- Export file for user SSTEST --
-- Created by SINO_PING on 2012-7-30, 18:16:27 --
-------------------------------------------------

spool ciinsureriskwarning.log

prompt
prompt Creating table CIINSURERISKWARNING
prompt ==================================
prompt
create table CIINSURERISKWARNING
(
DEMANDNO VARCHAR2(50) not null,
SERIALNO NUMBER not null,
RISKWARNINGTYPE VARCHAR2(2),
CLAIMCODE VARCHAR2(50),
COMPANYID VARCHAR2(8),
ACCIDENTTIME VARCHAR2(20),
ACCIDENTPLACE VARCHAR2(100)
)
;
comment on column CIINSURERISKWARNING.DEMANDNO
is '查询码';
comment on column CIINSURERISKWARNING.SERIALNO
is '序号';
comment on column CIINSURERISKWARNING.RISKWARNINGTYPE
is '风险警示类型';
comment on column CIINSURERISKWARNING.CLAIMCODE
is '理赔编号';
comment on column CIINSURERISKWARNING.COMPANYID
is '保险公司代码';
comment on column CIINSURERISKWARNING.ACCIDENTTIME
is '出险时间';
comment on column CIINSURERISKWARNING.ACCIDENTPLACE
is '查询码';
alter table CIINSURERISKWARNING
add constraint PK_CIINSURERISKWARNING primary key (DEMANDNO, SERIALNO);
create table CIINSURERISKWARNING
(
DEMANDNO VARCHAR2(50) not null,
SERIALNO NUMBER not null,
RISKWARNINGTYPE VARCHAR2(2),
CLAIMCODE VARCHAR2(50),
COMPANYID VARCHAR2(8),
ACCIDENTTIME VARCHAR2(20),
ACCIDENTPLACE VARCHAR2(100)
)
;

spool off

我的代码
Pattern p = Pattern.compile("(create table \\w+\\s*\\(.+\\);)");
Matcher m = p.matcher(buffer.toString());
while(m!=null && m.find()) {
System.out.println(m.group());
}
输出结果:
create table CIINSURERISKWARNING( DEMANDNO VARCHAR2(50) not null, SERIALNO NUMBER not null, RISKWARNINGTYPE VARCHAR2(2), CLAIMCODE VARCHAR2(50), COMPANYID VARCHAR2(8), ACCIDENTTIME VARCHAR2(20), ACCIDENTPLACE VARCHAR2(100));comment on column CIINSURERISKWARNING.DEMANDNO is '查询码';comment on column CIINSURERISKWARNING.SERIALNO is '序号';comment on column CIINSURERISKWARNING.RISKWARNINGTYPE is '风险警示类型';comment on column CIINSURERISKWARNING.CLAIMCODE is '理赔编号';comment on column CIINSURERISKWARNING.COMPANYID is '保险公司代码';comment on column CIINSURERISKWARNING.ACCIDENTTIME is '出险时间';comment on column CIINSURERISKWARNING.ACCIDENTPLACE is '查询码';alter table CIINSURERISKWARNING add constraint PK_CIINSURERISKWARNING primary key (DEMANDNO, SERIALNO);create table CIINSURERISKWARNING( DEMANDNO VARCHAR2(50) not null, SERIALNO NUMBER not null, RISKWARNINGTYPE VARCHAR2(2), CLAIMCODE VARCHAR2(50), COMPANYID VARCHAR2(8), ACCIDENTTIME VARCHAR2(20), ACCIDENTPLACE VARCHAR2(100));

我想要的是只把建表语句挖出来,如下:
create table CIINSURERISKWARNING( DEMANDNO VARCHAR2(50) not null, SERIALNO NUMBER not null, RISKWARNINGTYPE VARCHAR2(2), CLAIMCODE VARCHAR2(50), COMPANYID VARCHAR2(8), ACCIDENTTIME VARCHAR2(20), ACCIDENTPLACE VARCHAR2(100));

请高手指点一下,我的正则表达式为什么达不到目标那,谢谢
...全文
218 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever_1123 2012-07-31
  • 打赏
  • 举报
回复
哦,明白了,也就是说不加?号是一直找到最后一个能匹配的项才停止,如果加了?号就只找到第一个匹配项就停止。谢谢goldenfish1919兄弟的答案和swoky兄弟的解说
swoky 2012-07-31
  • 打赏
  • 举报
回复
即然goldenfish1919比较忙,那我就说下我的理解:

主要说下.+和.+?的区别

一般默认情况下,正则的量词是贪婪的,也就是“尽可能多地匹配”,举个例子说,比如"a+"这个正则,对于"aaaaaab"这个字符串,它就会匹配到6个a,对于你的建表语句而言,当匹配到第一个create table结束时,并不会立即结束,而是还去尝试寻找尽可能多的匹配结果,所以他找啊找,找到了第二个create table,如果有三个create table的话,他也一直会找到第三个

与贪婪相反的就是勉强,它是“尽可能少地匹配”,它会用最小的努力去完成正则的匹配要求
回到上面的那个例子,如果正则换成了"a+?",对于目标字符串还是"aaaaaab",那么这个正则就只会匹配一个a,因为"+"量词的意思是“一个或一个以上”,匹配一个a就能满足要求,它就不再去尝试了(不像贪婪的"a+"那样,不遗余力将所有符合要求的都匹配了)

忘goldenfish1919兄弟前来斧正
forever_1123 2012-07-31
  • 打赏
  • 举报
回复
刚试了一下,可以了,谢谢啊
能说一下为什么我的不行吗?
你写的(create table \\w+\\s*\\(.+?\\);)比我的里面多了一个?号,请问这是什么道理啊
若鱼1919 2012-07-31
  • 打赏
  • 举报
回复

Pattern p = Pattern.compile("(create table \\w+\\s*\\(.+?\\);)");
Matcher m = p.matcher(buffer.toString());
while(m!=null && m.find()) {
System.out.println(m.group());
}
若鱼1919 2012-07-31
  • 打赏
  • 举报
回复

Pattern p = Pattern.compile("(create table \\w+\\s*\\(.+?\\);)");
Matcher m = p.matcher(buffer.toString());
while(m!=null && m.find()) {
System.out.println(m.group());
}

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧