我有一个例程,它尝试读取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;
}
答案 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);
)。