我正在尝试解析一个简单的DDL语句。首先,我试图拉出表名。 语法类似于“ CREATE TABLE DB_NAME.TABLE_NAME”
到目前为止,我已经知道了:
String line = "CREATE TABLE DB_NAME.T_NAME";
String pattern = ".*?\\bTABLE\\s+(\\w+)\\b.*";
System.out.println(line.replaceFirst(pattern, "$1"));
那使我回到了“ DB_NAME”。如何获取还给我的“ T_NAME”?
我尝试跟踪this answer中的更新,但由于我的正则表达式技能非常有限,我无法使其正常工作。
答案 0 :(得分:3)
那是什么呢?
TABLE
首先将.*?\\bTABLE\\s+
关键字与DB_NAME.
匹配。然后将\\w+\\.
与T_NAME
匹配。最后,它与(\\w+)
匹配并捕获ns tutorial.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"))
答案 1 :(得分:2)
以下是一小段代码(使用命名的捕获组):
String line = "CREATE TABLE DB_NAME.T_NAME";
Pattern pattern = Pattern.compile("CREATE TABLE (?<database>\\w+)\\.(?<table>\\w+)");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
String database = matcher.group("database"); // DB_NAME
String table = matcher.group("table"); // T_NAME
}
答案 2 :(得分:1)
您可以将TABLE
之后的所有字符串提取到一个组中,然后用逗号分割以获取单个值:
String line = "CREATE TABLE DB_NAME.T_NAME";
String pattern = "\\bTABLE\\s+(\\w+(?:\\.\\w+)*)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(line);
if (m.find()){
System.out.println(Arrays.toString(m.group(1).split("\\.")));
// => [DB_NAME, T_NAME]
}
请参见Java demo。
如果您确定字符串的传入格式,甚至可以使用
"\\bTABLE\\s+(\\S+)"
尽管\w+(?:\.\w+)*
匹配1+个单词字符,后跟0+重复的.
和1+个单词字符,但\S+
则明显匹配1+个非空白字符。