我正在开发一个在基于linux的系统上运行的商业(非开源)C++项目.我需要在C++代码中做一些正则表达式.(我知道:我现在有2个问题.)
问题:经常从C/C++开始使用正则表达式的人建议我查看哪些库?快速搜索引起了我的注意:
1)Boost.Regex(我需要阅读Boost软件许可证,但这个问题与软件许可证无关)
2)C(不是C++)POSIX正则表达式(#include <regex.h>,regcomp,regexec等)
3)http://freshmeat.net/projects/cpp_regex/ (我对此一无所知;似乎是GPL,因此无法在此项目中使用)
好吧,这不是我遇到这个问题的原始程序,但是我把它复制得更小了.非常简单的问题.
main.cpp中:
#include <iostream>
#include <regex>
using namespace std;
int main()
{
regex r1("S");
printf("S works.\n");
regex r2(".");
printf(". works.\n");
regex r3(".+");
printf(".+ works.\n");
regex r4("[0-9]");
printf("[0-9] works.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用此命令成功编译,没有错误消息:
$ g++ -std=c++0x main.cpp
Run Code Online (Sandbox Code Playgroud)
g++ -v顺便说一下,最后一行是:
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时的结果:
$ ./a.out
S works.
. works.
.+ works.
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted
Run Code Online (Sandbox Code Playgroud)
如果我将r4更改为,,或者\\s,它会以相同的方式发生.这是编译器的问题吗?我或许可以相信C++ 11的正则表达式引擎有不同的方式来表达"空白"或"单词字符",但方括号不起作用是一个延伸.它是否已在4.6.2中得到修复?\\w[a-z]
编辑:
约阿希姆Pileborg已提供的部分解决方案,使用额外的regex_constants参数,以使支撑方括号语法,但既不basic,extended,awk,也不 …
我有一个vector包含strings遵循格式的text_number-number
例如: Example_45-3
我只想要第一个数字(45在示例中),而不是我能用当前代码做的其他事情:
std::vector<std::string> imgNumStrVec;
for(size_t i = 0; i < StrVec.size(); i++){
std::vector<std::string> seglist;
std::stringstream ss(StrVec[i]);
std::string seg, seg2;
while(std::getline(ss, seg, '_')) seglist.push_back(seg);
std::stringstream ss2(seglist[1]);
std::getline(ss2, seg2, '-');
imgNumStrVec.push_back(seg2);
}
Run Code Online (Sandbox Code Playgroud)
是否有更简化和更简单的方法来做到这一点?如果是的话,他们是什么?
我纯粹是出于在一天结束时学习如何更好地编写代码的愿望,上面的代码确实成功地提取了第一个数字,但它看起来很长并且很圆润.
什么是扩展的最佳方式
${MyPath}/filename.txt to /home/user/filename.txt
Run Code Online (Sandbox Code Playgroud)
要么
%MyPath%/filename.txt to c:\Documents and settings\user\filename.txt
Run Code Online (Sandbox Code Playgroud)
遍历遍历路径字符串直接寻找环境变量?我看到wxWidgets有一个wxExpandEnvVars函数.在这种情况下我不能使用wxWidgets,所以我希望找到一个boost :: filesystem等价或类似的.我只使用主目录作为示例,我正在寻找通用路径扩展.
我想在CentOS 7上使用带有clang/clang ++的C++ 11或C++ 14.如何构建这个构建环境?
为什么在g ++(Debian 4.6.3-1)4.6.3或clang version 3.2(trunk 159457)中找不到匹配项
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string line("test");
regex pattern("test",regex_constants::grep);
smatch result;
bool ret(false);
ret = regex_search(line,result,pattern);
cout << boolalpha << ret << endl;
cout << result.size() << endl;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
产量
false
0
Run Code Online (Sandbox Code Playgroud) 我在C++ 11中尝试一个相当简单的正则表达式匹配(使用gcc 4.7.2),但是我遇到了很多麻烦.尝试使用构造模式
std::regex unquoted(R"regex(\s*([^",]+)\s*)regex");
Run Code Online (Sandbox Code Playgroud)
导致构造函数std::regex_error使用代码抛出异常std::regex_constants::error_escape.在线的几个正则表达式测试人员对同一个表达式没有任何问题,我尝试使用不同的一些不同的语法选项无济于事.C++正则表达式语法是否存在根本不同的东西,我没有理解?
任何更熟悉gcc的人都可以指出为什么下面的样本在gcc 4.9.2上无法匹配但在gcc 5.3上成功了吗?有什么我可以做的来交替模式,以便它可以工作(似乎在VS 2013上工作正常)?
#include <iostream>
#include <regex>
std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*)\\r\\n(([!#\\$%&\\*\\+\\-\\./a-zA-Z\\^_`\\|-]+\\:[^\\r]+\\r\\n)*)\\r\\n");
const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";
int main()
{
std::cmatch results;
bool matched = std::regex_search(test, test + strlen(test), results, pattern);
std::cout << matched;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我假设我使用的是gcc 4.9.2中不支持但稍后添加或修复的内容,但我不知道在哪里查找它.
UPDATE
由于大量的帮助和建议,我试图回溯问题而不是仅仅切换到gcc 5.我得到了正确的匹配修改:
#include <iostream>
#include <regex>
std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*?)\\r\\n(?:([^:]+\\:[^\\r]+\\r\\n)*)\\r\\n");
const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";
int main()
{
std::cmatch results;
bool matched = std::regex_search(test, test + strlen(test), results, pattern);
std::cout << matched << std::endl;
if (matched) …Run Code Online (Sandbox Code Playgroud) 试图学习如何在C++ 11中使用新的std :: regex.但我尝试的例子是抛出一个我不明白的regex_error异常.这是我的示例代码:
#include <iostream>
#include <regex>
int main()
{
std::string str = "xyzabc1xyzabc2xyzabc3abc4xyz";
std::regex re( "(abc[1234])" ); // <-- this line throws a C++ exception
// also tried to do this:
// std::regex re( "(abc[1234])", std::regex::optimize | std::regex::extended );
while ( true )
{
std::cout << "searching in " << str << std::endl;
std::smatch match;
std::regex_search( str, match, re );
if ( match.empty() )
{
std::cout << "...no more matches" << std::endl;
break;
}
for ( auto x …Run Code Online (Sandbox Code Playgroud) 我尝试使用C++ 11的正则表达式,但即使在简单的例子中也失败了.从外面看,似乎只比较字符串,例如:
std::regex_match(std::string{""}, std::regex{"a?"}) // false (???)
std::regex_match(std::string{"a?"}, std::regex{"a?"}) // true (???)
Run Code Online (Sandbox Code Playgroud)
相比之下,Boost的regexp库的行为与我预期的一样:
boost::regex_match(std::string{""}, boost::regex{"a?"}) // true (OK)
boost::regex_match(std::string{"a?"}, boost::regex{"a?"}) // false (OK)
Run Code Online (Sandbox Code Playgroud)
我使用GCC 4.8.2和clang 3.4(也使用GCC的STL库)进行了测试.库已损坏,或者我不理解C++ 11标准定义的语法.