c ++字符串和正则表达式

时间:2016-10-30 10:06:48

标签: c++ string

仅在一个月前,我开始学习编码,因为我发现我喜欢它。我选择了C ++,虽然我知道有些语言对于初学者来说更容易学习,但要知道,我做得很好。两天前,我开始写一个包含这些行的小程序:

string input {"This is the example"};
string b {"is"};
regex r {R"(\s*\is\s*)"}; 

这里的目标是在字符串输入中使用正则表达式r搜索单词或字符串b包含的单词。字符串b的内容来自文件。如果我直接在正则表达式中写出我正在寻找的单词(就像我上面用'is'所做的那样),那么它可以工作,但是如何实现字符串b包含的单词会自动出现在正则表达式中?我尝试了几件事,但他们都失败了,因为如果我尝试插入b的名称(例如像这样:regex r {R“(\ s * \”b“\ s *)”};),那么表达式不搜索b的内容。

任何人都可以通过正确地写这些线来帮助我,这样我就能看到我做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为,你使用花括号而不是括号。所以你可能会遇到语法错误。

语法:datatype identifier(literal); //声明

功能(参数); //函数调用

identifier = function(arguments); //带回车的函数调用

参考下面的教程:

寻找正则表达式匹配

使用主题字符串作为第一个参数调用std :: regex_search(),并使用正则表达式对象作为第二个参数来检查正则表达式是否可以匹配字符串的任何部分。如果要检查正则表达式是否可以匹配整个主题字符串,请使用相同的参数调用std :: regex_match()。由于std :: regex缺少在字符串的开头和结尾唯一匹配的锚点,因此在使用正则表达式验证用户输入时必须调用regex_match()。

regex_search()和regex_match()都返回true或false。要获取regex_search()匹配的字符串部分,或者在使用任一函数时通过捕获组来匹配字符串的部分,您需要传递模板类std :: match_results的对象作为第二个参数。然后,正则表达式对象成为第三个参数。使用以下四个模板实例之一的默认构造函数创建此对象:

std::cmatch when your subject is an array of char
std::smatch when your subject is an std::string object
std::wcmatch when your subject is an array of wchar_t
std::wsmatch when your subject is an std::wstring object

当函数调用返回true时,可以调用match_results对象的str(),position()和length()成员函数来获取匹配的文本,或匹配的起始位置及其长度相对于主题字符串。不带参数调用这些成员函数或使用0作为参数来获得整体正则表达式匹配。调用它们传递1或更大以获得特定捕获组的匹配。 size()成员函数指示捕获组的数量加上整体​​匹配的数量。因此,您可以将值传递给size() - 1到其他三个成员函数。

总而言之,我们可以得到第一个捕获组匹配的文本,如下所示:

std::string subject("Name: John Doe");
std::string result;
try {
  std::regex re("Name: (.*)");
  std::smatch match;
  if (std::regex_search(subject, match, re) && match.size() > 1) {
    result = match.str(1);
  } else {
    result = std::string("");
  } 
} catch (std::regex_error& e) {
  // Syntax error in the regular expression
}