首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java正则挖取筑表语句

2012-08-31 
java正则挖取建表语句java正则挖取建表语句:--------------------------------------------------- Export

java正则挖取建表语句
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));

请高手指点一下,我的正则表达式为什么达不到目标那,谢谢

[解决办法]

Java code
Pattern p = Pattern.compile("(create table \\w+\\s*\\(.+?\\);)");        Matcher m = p.matcher(buffer.toString());        while(m!=null && m.find()) {            System.out.println(m.group());        }
[解决办法]
即然goldenfish1919比较忙,那我就说下我的理解:

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

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



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

忘goldenfish1919兄弟前来斧正

热点排行