2013-11-02 73 views
0

我正在做我的miniSQL,並試圖使用正則表達式來解析用戶輸入。regex_match()後的冗餘空行()

我未能處理'create table myTable(c char(20))'的情況。如下所示,第二條和第三條線是不需要的。我只是想知道他們爲什麼會出現在結果中。

這裏是我的代碼:

void onCreateTable(const smatch& cmd); 

int main() 
{ 
    std::string cmd = " create table a(c char(20))"; 
    regex pattern; 
    smatch result; 
    pattern = regex("\\s*create\\s+table\\s+(\\w+)\\s*\\((.*)\\)\\s*", regex::icase); 
    if (regex_match(cmd, result, pattern)) 
    { 
     onCreateTable(result); 
    } 

    int x; cin >> x; 
    return 0; 
} 

void onCreateTable(const smatch& cmd) 
{ 
    cout << "onCreateTable" << endl; 
    string tableName = cmd[1]; 
    string attr = cmd[2]; 
    regex pattern = regex("\\s*(\\w+\\s+int)|(\\w+\\s+float)|(\\w+\\s+char\\(\\d+\\))",  regex::icase); 
    // which will print redundant blank lines 

    // while the below one will print the exact result 
    // regex pattern = regex("\\s*(\\w+\\s+char\\(\\d+\\))", regex::icase); 
    smatch result; 
    if (regex_match(attr, result, pattern)) 
    { 
     cout << "match!" << endl; 
     for (size_t i = 0; i < result.size(); i ++) 
     { 
      cout << result[i] << endl; 
     } 
    } else 
    { 
     cout << "A table must have at least 1 column." << endl; 
    } 
} 
+0

看起來它是爲所有三個括號表達式記錄一個組,但顯然只有其中一個匹配,所以它將前兩個輸出爲空格。如果將另一對括號中的\\ s *'後的整個表達式包裝在一起,會發生什麼?如果你改變順序,所以帶有'char'的組在另外兩個之前,那麼你會在最後得到兩個空行,而不是在中間? –

回答

0

你最後的正則表達式有3個由交替分離的捕捉組。
只有1個匹配。你正在打印所有的smatch數組。
smatch數組是所有捕獲組的大小。

 \s* 
1 (\w+ \s+ int) 
    | 
2 (\w+ \s+ float) 
    | 
3 (\w+ \s+ char\(\d+ \)) 

組0是整場比賽。
組1不匹配,其空。
組2不匹配,其空。
第3組匹配。

你可能想檢查一個組是否匹配。
有點像if(result[i].matched){}
或任何標誌smatch使用。

+0

我明白了。謝謝! –