簡體   English   中英

內部遞歸正則表達式Java

[英]internally recursive regular expression java

我有以下sql查詢,希望能夠將它們組合在一個正則表達式中:

CREATE INDEX blah_idx ON blah (id ASC)

CREATE INDEX blah2_idx ON blah2 (foo ASC, id DEC)

我希望能夠使用Java正則表達式將這些分組,以便得到:

blah_idx, blah, id, ASC

blah2_idx, blah2, foo, ASC, id, DEC

我可以使用CREATE INDEX (\\\\\\w+) ON (\\\\\\w+) \\\\((\\w+) (\\w+) \\\\)來獲得第一個,但我希望也可以將第二個分組無法看到定義\\\\((\\w+) (\\w+) \\\\)以重復匹配。

這有可能嗎?

讓我想起了我曾經問過的一個問題:

如何使用正則表達式(遞歸)匹配嵌套函數調用(括號對)

不幸的是,在包括Java在內的大多數Regexp語言中都無法實現。

為了便於閱讀,我省略了一些括號。 並且空格可以是\\\\s+*

"CREATE INDEX \\w+ ON \\w+ \\((\\w+ (ASC|DESC)(, \\w+ (ASC|DEC))*))\\)"
                              1     2        23       4       43 21   

允許嵌套組( ( ) ) ,並從左到右編號。 有關檢索,請參閱javadoc。

    final String[] sqls = {
        "CREATE INDEX blah_idx ON blah (id ASC)",
        "CREATE INDEX blah2_idx ON blah2 (foo ASC, id DEC)",
        "CREATE INDEX blah2_idx ON blah2 (foo ASC, id DEC, name ASC)",
    };

    final Pattern createIndexPattern = Pattern.compile(
      "CREATE INDEX (\\w+) ON (\\w+) \\(((\\w+) (ASC|DESC)(, (\\w+) (ASC|DEC))*)\\)");
    for (String sql : sqls) {
        System.out.println("SQL: " + sql);
        Matcher m = createIndexPattern.matcher(sql);
        if (!m.matches()) {
            System.out.println("No match!");
        } else {
            System.out.println("Match!");
            int groupCount = m.groupCount();
            for (int groupI = 1; groupI <= groupCount; ++groupI) {
                System.out.printf("[%d] %s%n", groupI, m.group(groupI));
            }
            String[] fieldsWithOrdering = m.group(3).split(",\\s*");
            System.out.println(Arrays.toString(fieldsWithOrdering));
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM