Cpp:为什么下一个正则表达式匹配不正确?

时间:2016-12-16 11:24:56

标签: c++

我有下一个代码示例:

    std::string str("example1   ");
    std::smatch sm;
    std::regex e("[a-zA-Z_]+[0-9a-zA-Z_]*\s*");
    if (std::regex_match(str, sm, e))
    {
        std::cout << "ok_match";
    }

它应该接受包括空格在内的所有内容,但事实并非如此。 例如,如果字符串为:

std::string str("example1");

所以“ok_match”将在屏幕上打印出来。 那是为什么?

1 个答案:

答案 0 :(得分:1)

您尚未正确转义"\s"序列。实际上,您的编译器应该向您显示类似

的警告
main.cpp: In function 'int main()':
main.cpp:9:16: warning: unknown escape sequence: '\s'
   std::regex e("[a-zA-Z_][0-9a-zA-Z_]*\s*");
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~

要在C ++字符串中表示正则表达式模式(如\s),您需要转义反斜杠才能在字符串中获得文字反斜杠。详细说明一下:

  • "\n"代表一个换行符。你以前可能已经看过了。
  • "\\n"代表反斜杠,后跟字母n
  • 同样,编译器将"\s"视为转义序列,但序列"\s"实际上并不存在。
  • 您希望字符串中包含实际反斜杠+ s,因此您需要编写"\\s":反斜杠,后跟字母s。反过来,std::regex将其理解为空白的简写。

这个程序应该做你想要的:

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

int main()
{
  std::string str("example1   ");
  std::smatch sm;
  std::regex e("[a-zA-Z_][0-9a-zA-Z_]*\\s*");
  if (std::regex_match(str, sm, e))
  {
    std::cout << "ok_match";
  }
}

住在coliru