Regex - получить второе слово после первого матча - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь разобрать простое выражение 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"?

Я попытался выполнить обновление в этом ответе , но не смог заставить его работать, возможно, из-за моих очень ограниченных навыков регулярных выражений.

Ответы [ 3 ]

3 голосов
/ 02 июля 2019

Как насчет этого:

.*?\\bTABLE\\s+\\w+\\.(\\w+)\\b.*

Демо

Сначала сопоставляется ключевое слово TABLE с .*?\\bTABLE\\s+. Тогда это соответствует DB_NAME. с \\w+\\.. Наконец это соответствует и захватывает T_NAME с (\\w+)

2 голосов
/ 02 июля 2019

Вот небольшой фрагмент кода, который будет выполнять (используя именованные группы захвата):

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
}
1 голос
/ 02 июля 2019

Вы можете извлечь всю строку после 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 .

Если вы уверены во входящем формате строки, вы можете даже использовать

"\\bTABLE\\s+(\\S+)"

См. еще одну демонстрацию Java .

В то время как \w+(?:\.\w+)* соответствует 1+ символам слова, за которыми следуют 0+ повторений . и 1+ слова, \S+ явно соответствует 1+ непробельным символам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...