使用C ++标记字符串

时间:2017-05-04 07:28:22

标签: c++ regex tokenize

我有一个字符串

"server ('m1.labs.teradata.com') username ('user5') password ('user)5') dbname ('default') "

我想把它分开为

string1 = server
string2 = 'm1.labs.teradata.com'

和密码有')'在里面。 任何人都可以帮我解决如何使用正则表达式来使用它。??

1 个答案:

答案 0 :(得分:0)

我只测试了正则表达式以提取您的项目,但我认为以下代码段可行。

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "server ('m1.labs.teradata.com') username ('user5') password ('user)5') dbname ('default') ";
    std::regex rgx("server\s+\(\'[^']+\'\)\s+username\s+(\'[^']+\'\)\s+password\s+\(\'[^']*\'\)\s+dbname\s+\(\'[^']+\'\)");
    std::smatch match;

    if (std::regex_search(s.begin(), s.end(), match, rgx)) {
        std::cout << "match: " << match[1] << '\n';
        std::cout << "match: " << match[2] << '\n';
        ....
    }
}

在以下示例中,您将迭代正则表达式中的所有匹配项。

#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string str("server ('m1.labs.teradata.com') username ('user5') password ('user)5') dbname ('default') ");
    std::regex r("server\s+\(\'[^']+\'\)\s+username\s+(\'[^']+\'\)\s+password\s+\(\'[^']*\'\)\s+dbname\s+\(\'[^']+\'\)");
    std::smatch m;
    std::regex_search(str, m, r);
    for(auto v: m) std::cout << v << std::endl; // Here you will iterate over all matches
}

对于将字符串传递给函数的其他查询:

void print(const std::string& input)
{
    cout << input << endl;
}
or a const char*:

void print(const char* input)
{
    cout << input << endl;
}

这两种方式都允许你这样称呼它:

print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made

第二个版本确实需要为std :: strings调用c_str():

print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made