[英]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+) \\\\)
以重復匹配。
這有可能嗎?
為了便於閱讀,我省略了一些括號。 並且空格可以是\\\\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.