1

我有以下 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+) \\)重复匹配的定义。

这甚至可能吗?

4

2 回答 2

1

让我想起了我曾经问过的一个问题:

如何使用正则表达式(递归?)匹配嵌套函数调用(括号对)

不幸的是,在包括 Java 在内的大多数正则表达式语言中都是不可能的。

于 2013-03-08T15:42:52.717 回答
1

为了便于阅读,我省略了一些括号。空格可以是\\s+or *

"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));
        }
    }
于 2013-03-08T15:46:48.827 回答