相关疑难解决方法(0)

C++:我应该使用什么正则表达式库?

我正在开发一个在基于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,因此无法在此项目中使用)

c++ regex linux

106
推荐指数
8
解决办法
11万
查看次数

这个C++ 11正则表达式错误我或编译器?

好吧,这不是我遇到这个问题的原始程序,但是我把它复制得更小了.非常简单的问题.

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,也不 …

c++ regex gcc c++11

54
推荐指数
3
解决办法
5万
查看次数

C++从字符串中间提取数字

我有一个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)

是否有更简化和更简单的方法来做到这一点?如果是的话,他们是什么?

我纯粹是出于在一天结束时学习如何更好地编写代码的愿望,上面的代码确实成功地提取了第一个数字,但它看起来很长并且很圆润.

c++ string stringstream

23
推荐指数
7
解决办法
4万
查看次数

展开其路径中包含环境变量的文件名

什么是扩展的最佳方式

${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等价或类似的.我只使用主目录作为示例,我正在寻找通用路径扩展.

c++ wxwidgets boost-filesystem

22
推荐指数
4
解决办法
2万
查看次数

如何在CentOS 7上通过clang构建libcxx和libcxxabi

我想在CentOS 7上使用带有clang/clang ++的C++ 11或C++ 14.如何构建这个构建环境?

c++ centos clang c++11 libc++

17
推荐指数
1
解决办法
1万
查看次数

与c ++ 11正则表达式不匹配

为什么在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++ regex c++11

13
推荐指数
1
解决办法
4444
查看次数

C++ 11正则表达式匹配

我在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++正则表达式语法是否存在根本不同的东西,我没有理解?

c++ regex gcc

11
推荐指数
1
解决办法
5885
查看次数

gcc 4.9.2和gcc 5.3之间正则表达式支持的差异

任何更熟悉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++ regex gcc

11
推荐指数
1
解决办法
933
查看次数

为什么这个C++ 11 std :: regex示例会抛出一个regex_error异常?

试图学习如何在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++ regex g++ c++11

8
推荐指数
1
解决办法
3万
查看次数

使用C++ 11 regexp和gcc 4.8.2时的结果很奇怪(但与Boost regexp配合使用)

我尝试使用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标准定义的语法.

c++ regex gcc c++11 gcc4.8

8
推荐指数
1
解决办法
7818
查看次数

标签 统计

c++ ×10

regex ×7

c++11 ×5

gcc ×4

boost-filesystem ×1

centos ×1

clang ×1

g++ ×1

gcc4.8 ×1

libc++ ×1

linux ×1

string ×1

stringstream ×1

wxwidgets ×1