2010-05-07 5 views
0

sqlite_master의 sql 열에서 SQLite 결과 집합의 열 이름을 추출하려고합니다. match() 및 split() 함수의 정규 표현식에 정리되어 있습니다.Javascript RegEx를 사용하여 SQLite에서 열 이름 추출 SQL

t1.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" and name!="__WebKitDatabaseInfoTable__";', [], 
    function(t1, result) { 
    for(i = 0;i < result.rows.length; i++){ 
    var tbl = result.rows.item(i).name; 
    var dbSchema = result.rows.item(i).sql; 
// errors out on next line 
    var columns = dbSchema.match(/.*CREATE\s+TABLE\s+(\S+)\s+\((.*)\).*/)[2].split(/\s+[^,]+,?\s*/); 
    } 
    }, 
    function(){console.log('err1');} 
); 

나는 정규식과

name,seq 
Key,Value 
IconID,png,img32,img64,Version 

어떤 도움을 크게 감상 할 수 ... ... 논문과 같은 문자열로

CREATE TABLE sqlite_sequence(name,seq); 
CREATE TABLE tblConfig (Key TEXT NOT NULL,Value TEXT NOT NULL); 
CREATE TABLE tblIcon (IconID INTEGER NOT NULL PRIMARY KEY,png TEXT NOT NULL,img32 TEXT NOT NULL,img64 TEXT NOT NULL,Version TEXT NOT NULL) 

다음과 같은 SQL 문을 구문 분석합니다.

답변

0

일치하는 정규 표현식에서 주 문제는 \ s +입니다. /.*CREATE\s+TABLE\s+(\S+)\s*\((.*)\).*/)

두 번째 문제는 분할입니다. 나는 당신이 정규식에서 할 노력 무엇을 아주 잘 모르겠지만, 여기의 모든 예제에 작동합니까 그것을하는 간단한 방법 좀 더 :

var columns= dbSchema.match(/.*CREATE\s+TABLE\s+(\S+)\s*\((.*)\).*/)[2].split(/,/); 
for(i = 0;i < columns.length; i++) { 
    columns[i] = columns[i].replace(/\s.*/g, ''); 
} 
+0

감사합니다! 나는 그것이 거의 다라고 생각한다. # 1의 RegEx의 결과는 다음과 같습니다. [ "표 sqlite_sequence을 만듭니다 (이름, 서열)", "sqlite_sequence", "이름, 서열"] [ "TABLE tblConfig CREATE (키 TEXT NULL NOT을, 값 TEXT NOT NULL)", "tblConfig" "Key TEXT NOT NULL, Value TEXT NOT NULL"] 2 번 실행하면 [ "CREATE", "sqlite_sequence", "name, seq"]가 표시됩니다. 내가 원한 것은 아니었다. "INTEGER NOT NULL"을 제거하고 쉼표를 유지하는 [2] 열의 다른 열 속성을 제거하려면 어떻게합니까? – DataZombies

+0

@ NimbusSoftware - # 2 참조. for 루프에서 대체는 – DVK

+0

입니다. 다음은 열이 루프를 통해 실행될 때 발생합니다. [ "CREATE", "tblConfig", "Key"]. 칼럼 [2]의 첫 번째 단어를 제외한 모든 것이 핵으로 처리됩니다. 나는 컬럼 [2]을 보길 원합니다 : "Key, Value". 도와 주셔서 감사합니다. 감사. – DataZombies

관련 문제