2

現在、ファイルから読み取った行を使用してこれを手動で作成しており、テーブルが始まるすべてのテーブル ddl を読み取ろうとしています。a_

これの入力:

Other stuff: 

Other stuff: 
create table a_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
stuff
create table a_table2 (
    id number(10,0) not null,
    primary key (id)
)

Other stuff: 
create table b_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
other stuff 

other stuff

これだけを出力する必要があります

create table a_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
create table a_table2 (
    id number(10,0) not null,
    primary key (id)
)

現在、私は LineReaders を使用しており、見たときに覚えてから、見るcreate tableまですべてを読んでいます)

これが最も効率的な方法ですか?私が使用できる派手な正規表現はありますか?

次の正規表現を試しましたが、文字列全体を再度返すだけなので、これは機能しませんでした。おそらく、新しい行がそれを壊しています

"^.*create.*a_(.*?)\\).*$", "$1")

アドバイスをいただければ幸いです

ありがとう

4

2 に答える 2

3

次の正規表現ベースのコードは、createtablesqlステートメントに括弧が2レベルだけネストされている限り機能します。

String sql = "Other stuff: \n\nOther stuff: \ncreate table a_table1 (\nid number(10,0) not null,\ntimestamp number(19,0) not null,\nprimary key (id)\n)\nstuff\ncreate table a_table2 (\nid number(10,0) not null,\nprimary key (id)\n)\n\nOther stuff: \ncreate table b_table1 (\nid number(10,0) not null,\ntimestamp number(19,0) not null,\nprimary key (id)\n)\nother stuff \n\nother stuff\n\n";
Pattern p = Pattern.compile(
   "(?i)create\\s+table\\s+a_\\w+\\s+\\((?:[^()]+|\\([^()]+\\))*\\)"
);
Matcher m = p.matcher(sql);
while (m.find()) {
    System.out.println(m.group());
}

出力

create table a_table1 (
   id number(10,0) not null,
   timestamp number(19,0) not null,
   primary key (id)
)
create table a_table2 (
   id number(10,0) not null,
   primary key (id)
)
于 2013-01-02T19:53:28.523 に答える
3

次のようなことを試してください:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    IOUtils.copyLarge(getClass().getClassLoader().getResourceAsStream("input.txt"), baos);
    String org = baos.toString();

    final Pattern compile = Pattern.compile("(?s)(create table a_.*?\n\\)\n)");
    final Matcher matcher = compile.matcher(org);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }

入力.txt

Other stuff:

Other stuff:
create table a_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
stuff
create table a_table2 (
    id number(10,0) not null,
    primary key (id)
)

Other stuff:
create table b_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
other stuff

出力

create table a_table1 (
    id number(10,0) not null,
    timestamp number(19,0) not null,
    primary key (id)
)
create table a_table2 (
    id number(10,0) not null,
    primary key (id)
)
于 2013-01-02T19:28:51.090 に答える