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