正则表达式-第一次比赛后获得第二个单词

时间:2019-07-01 21:51:38

标签: java regex

我正在尝试解析一个简单的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中的更新,但由于我的正则表达式技能非常有限,我无法使其正常工作。

3 个答案:

答案 0 :(得分:3)

那是什么呢?

TABLE

Demo

首先将.*?\\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+)"

请参见another Java demo

尽管\w+(?:\.\w+)*匹配1+个单词字符,后跟0+重复的.和1+个单词字符,但\S+则明显匹配1+个非空白字符。