2

私の質問は多くの人にとって単純なはずです。私は次のSQLを持っていて、正規表現を使用してテーブル名を取得したいと思います。

SELECT name, age FROM table1

この式を使用して、私はそれを大丈夫にすることができます

Pattern p = Pattern.compile(".*FROM\\s+(.*?)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])", Pattern.CASE_INSENSITIVE);
        Matcher result = p.matcher(pSql);
        if (result.find()) {
            lRetorno = result.group(1);
        }

ただし、テーブル名にスキーマ名(xyz.table1)が含まれている場合、私の式はすべてをもたらします。私の質問は...スキーマ/所有者なしでテーブル名のみを返すようにこのクエリを変更する必要があるのは何ですか?

どんな助けでも非常に高く評価されますよろしく

ラファエル・モイタ

4

2 に答える 2

5

たぶんこの方法で試してみてください

String data1="SELECT name, age FROM table1 whatever";
String data2="SELECT name, age FROM schema.table1 whatever";

Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])",Pattern.CASE_INSENSITIVE);

//test
Matcher m=p.matcher(data1);
while(m.find())
    System.out.println(m.group(1));
m=p.matcher(data2);
while(m.find())
    System.out.println(m.group(1));

出力:

table1 
table1 

編集

入力でテーブル名の後に「whatever」を配置しましたが、とにかく見つかったため、パーツが正常に($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])機能しないことに気付きました。

[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY]の代わりにを使用しているため、あなたのようには機能しません(WHERE|JOIN|START\\s+WITH|ORDER\\s+BY|GROUP\\s+BY)。たとえば、[abc]は(a | b | c)に等しいので、正規表現エンジンは、単語ではなく、そのセットから任意の文字を受け入れるように指示しますabc。パターンを次のようなものに改善します

Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)(\\s*$|\\s+(WHERE|JOIN|START\\s+WITH|ORDER\\s+BY|GROUP\\s+BY))",Pattern.CASE_INSENSITIVE);
于 2012-07-09T19:24:26.920 に答える
1

正規表現で解析するよりも、実際のパーサーを使用する方がよい場合があります。この関連する質問を参照してください。Zqlライブラリを推奨するSQLステートメントを解析するにはJavaAPIが必要です。

解析できるクエリの例があります。これは、作成する正規表現と少なくとも同じくらい堅牢に見えます。

InputStream is = new ByteArrayInputStream(sqlQueryString.getBytes("UTF-8"));
ZqlParser parser = new ZqlParser(is);
ZQuery query = (ZQuery)parser.readStatement();
Vector tables = query.getFrom();

あなたのためにそれをする必要があります。 tablesはsのであり、スキーマコンポーネントなしでその名前を取得するために1つで実行できVectorます。ZFromItemgetTable()

于 2013-04-18T18:11:16.630 に答える