RegEx从SQL脚本文件中提取表名

时间:2015-05-13 18:52:34

标签: android sql regex

我有一个例程,它尝试读取SQL脚本文件并从驻留的SQL语句中提取表名。例如,下面可能是典型的SQL脚本文件:

-- Drop the table first
DROP TABLE IF EXISTS working;

-- SQL Statement to create a new database.
CREATE TABLE IF NOT EXISTS working(
ToDoItem VARCHAR
, ToDoDateTime VARCHAR
, ToDoDateTimeEpoch Long
, ToDoTimeZone VARCHAR
, ToDoReminderEpoch Long
, ToDoReminderChk integer default 0
, ToDoLEDColor integer default 0
, ToDoFired integer default 0
, deleted integer default 0
);

我使用的正则表达式无效。我收到错误Look-behind pattern matches must have a bounded maximum length near index 58

我仍然是正则表达式的菜鸟,所以我从StackOverflow获得当前表达式只是为了现在遇到最大长度问题:

(?<=\\b(exists|from|join)\\s+[a-zA-Z0-9_$#-]*\\.{0,1}\\s{1,1})[a-zA-Z0-9_]+

代码:

    private static String tableName() {

    String name = "";

    Pattern pattern = Pattern.compile("(?<=\\b(exists|from|join)\\s+[a-zA-Z0-9_$#-]*\\.{0,1}\\s{1,1})[a-zA-Z0-9_]+");

    Matcher matcher;

    try {

        for (String sqlStmt : dbSQLParser.parseSqlFile(SQL_DIR + "/" + CREATE_FILE, appController.MainActivity().getAssets())){

            matcher = pattern.matcher(sqlStmt);

            if (matcher.find()){

                name = matcher.group(1);

                break;
            }
        }

    } catch (IOException ex) {

        ErrorHandler.logError(ex);
    }

    return name;
}

1 个答案:

答案 0 :(得分:1)

如果您计划提取working,即使您删除了后视,您的正则表达式也不匹配。您需要在结尾处匹配;(。也许,你想允许dot + alphanumerics。然后,您可以使用此正则表达式:

\b(?:exists|from|join)\s+([a-zA-Z0-9_$#-]*\.?\s*(?:[a-zA-Z0-9_]+)*)

请参阅demo

Pattern pattern = Pattern.compile("(?i)\\b(?:exists|from|join)\\s+([a-zA-Z0-9_$#-]*\\.?\\s*(?:[a-zA-Z0-9_]+)*)");

name将在第1组(matcher.group(1);)。