Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C样式正则表达式转换为C++样式_C++_Regex - Fatal编程技术网

如何将C样式正则表达式转换为C++样式

如何将C样式正则表达式转换为C++样式,c++,regex,C++,Regex,我试图通过正则表达式解析一个长字符串,我尝试使用下面的RE和本文中提到的文本来解析它 但是,当我尝试用相同的RE解析C++中的文本时,编译时的警告和输出不如预期。 请告知如何将此重新排序成一种格式,以便在C++程序中解析文本。 代码如下所示: std::string str = "root 21015 0.0 0.0 0 0 ? S " "16:07 0:00 [kworker/5:0]\n root 2

我试图通过正则表达式解析一个长字符串,我尝试使用下面的RE和本文中提到的文本来解析它

但是,当我尝试用相同的RE解析C++中的文本时,编译时的警告和输出不如预期。

请告知如何将此重新排序成一种格式,以便在C++程序中解析文本。 代码如下所示:

std::string str = "root     21015  0.0  0.0      0     0 ?        S    "
    "16:07   0:00 [kworker/5:0]\n            root     21095  0.0  0.0  "
    "    0     0 ?        S    16:08   0:00 [kworker/2:2]\n            "
    "root     21097  0.0  0.0      0     0 ?        S    16:08   0:00 ["
    "kworker/u16:4]\n            ashish   21103 17.1  1.2 591536 106056"
    " ?       Sl   16:12   0:01 /usr/lib/firefox/firefox";

std::regex firefox ("[0-9].\..*.firefox");

std::smatch sm;
std::regex_match (str, sm, firefox);
std::cout << "number of matches: " << sm.size() << std::endl;

std::cout << "matches were: " << std::endl;
for (unsigned int i = 0; i < sm.size(); i++)
{
    std::cout << "[" << sm[i] << "]";
}
结果如下:


在我看来,这只是字符串处理方式的一个问题。你可以试试

std::regex firefox (@"[0-9].\..*.firefox");
要指示它是字符串文字,或者如果不支持该语法,请尝试

std::regex firefox ("[0-9].\\..*.firefox");
也就是说,您确实希望字符串中包含\字符,而不是转义句点

编辑 从下面的注释中可以看出,C语法似乎不正确,或者句点应该像PHP?一样连接起来,但是它们不在正则表达式中连接


您能否在上面的示例中突出显示您想要匹配的内容,从开始到结束?我真的不知道要从哪里开始匹配,但是如果您试图查找数字和句点,上面的内容将从1.2开始。

在我看来,这只是字符串处理方式的问题。你可以试试

std::regex firefox (@"[0-9].\..*.firefox");
要指示它是字符串文字,或者如果不支持该语法,请尝试

std::regex firefox ("[0-9].\\..*.firefox");
也就是说,您确实希望字符串中包含\字符,而不是转义句点

编辑 从下面的注释中可以看出,C语法似乎不正确,或者句点应该像PHP?一样连接起来,但是它们不在正则表达式中连接


您能否在上面的示例中突出显示您想要匹配的内容,从开始到结束?我不能真正告诉你你想在哪里开始匹配,但是如果你想找到数字和句号,那么上面的1.2个开始。

< p>你必须要避开你的反斜线,让它们成为有效的C++字符串。例如,尝试:

std::regex firefox ("[0-9].\\..*.firefox");

你将不得不从你的反斜杠中逃出,以使它们成为有效的C++字符串。例如,尝试:

std::regex firefox ("[0-9].\\..*.firefox");
你需要在这里使用

你需要在这里使用


谢谢你的回复。这个表达本身没有什么问题

我只是使用了下面的语法来创建正则表达式,它工作得很好

std::regex otherProcessRegEx ("[0-9][0-9][:.:].*.[a-z].|[0-9][:.:].*.[a-z]",
               std::regex_constants::ECMAScript |     
               std::regex_constants::icase);

用C++ 11介绍了这些不同类型的正则表达式,需要说明。


谢谢你的回复。这个表达本身没有什么问题

我只是使用了下面的语法来创建正则表达式,它工作得很好

std::regex otherProcessRegEx ("[0-9][0-9][:.:].*.[a-z].|[0-9][:.:].*.[a-z]",
               std::regex_constants::ECMAScript |     
               std::regex_constants::icase);

用C++ 11介绍了这些不同类型的正则表达式,需要说明。


你好,埃瑞克。。感谢您的回复,我不希望看到字符串中的反斜杠,而是希望它找到我使用的点\。因此,它不使用点字符进行连接,而是尝试在给定字符串中查找点字符。哦,然后使用字符类。点也不会连在一起,它们是一个占位符。我将编辑我的答案。嗨,埃瑞克。。感谢您的回复,我不希望看到字符串中的反斜杠,而是希望它找到我使用的点\。因此,它不使用点字符进行连接,而是尝试在给定字符串中查找点字符。哦,然后使用字符类。点也不会连在一起,它们是一个占位符。我将编辑我的答案。虽然这在理论上可以回答问题,但在此处包含答案的基本部分,并提供链接供参考。虽然这在理论上可以回答问题,但在此处包含答案的基本部分,并提供链接供参考。