正则表达式在c ++中不起作用

时间:2017-01-18 10:56:20

标签: c++ regex

我正在尝试使用 regexec 匹配c ++中的正则表达式。

这是我试过的模式在java中正常工作

(^.*([0-9]{6}).*([0-9]{9}).*([0-9]{6,7}).*([0-9]{2,3}).*)

我尝试了这个,但输出错误

(.*)[[:digit:]{6}](.*)[[:digit:]]{9}(.*)[[:digit:]]{6,7}(.*)[[:digit:]]{2,3}(.*)

以下是我的c ++代码:

static int compile_regex (regex_t * r, const char * regex_text) {
    int status = regcomp (r, regex_text, REG_EXTENDED|REG_NEWLINE);
    if (status != 0) {
        char error_message[MAX_ERROR_MSG];
        regerror (status, r, error_message, MAX_ERROR_MSG);
        printf ("Regex error compiling '%s': %s\n",
                 regex_text, error_message);
        return 1;
    }
    return 0;
}
static int match_regex (regex_t * r, char * to_match) {
    char * p = to_match;
    int n_matches = 10;
    regmatch_t m[n_matches];
    int i = 0;
    int nomatch = regexec (r, p, n_matches, m, 0);
    return nomatch;
}
int match ( char * find_text ,string regex_txt) {

    char regex_text[regex_txt.size()+1];
    strcpy(regex_text , regex_txt.c_str());
    regex_t r;
    int ret ;
    compile_regex (& r, regex_text);
    ret = match_regex (& r, find_text);
    return ret;
}

3 个答案:

答案 0 :(得分:2)

POSIX正则表达式没有任何问题,但如果您想在便携式c ++ 11中执行此操作,则以下内容将起作用..

#include <iostream>
#include <regex>

using namespace std;

int main(void) {
    auto str = string("@000172@ 000002000[ 000001@ 13 8");
    auto rx = regex("(^.*([0-9]{6}).*([0-9]{9}).*([0-9]{6,7}).*([0-9]{2,3}).*)");
    auto it = sregex_iterator(str.begin(), str.end(), rx);
    auto ie = sregex_iterator();

    cout << "Found " << distance(it, ie) << " matches\n";
    // print submatches
    for (auto i = it; i != ie; ++i) {
        for(auto s : *i) {
            cout << s << endl;
        }
    }
}

https://regex101.com/确认代码正在做正确的事情 - 即输出如下:

Found 1 matches
@000172@ 000002000[ 000001@ 13 8
@000172@ 000002000[ 000001@ 13 8
000172
000002000
000001
13

答案 1 :(得分:1)

不使用与数字匹配的点,而是使用与非数字匹配的${carbon.local.ip}

\D

答案 2 :(得分:0)

检查您的编译器是否实际支持正则表达式。当GCC看起来像支持正则表达式(所有标题都存在,编译正常等等)时,我遇到了GCC的情况,但匹配的实际结果是错误的。将GCC更新到更新的版本解决了这个问题。