我有下一个代码示例:
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”将在屏幕上打印出来。 那是为什么?
答案 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