Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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+中不起作用+; 我试图用ReCeEx.在C++中匹配正则表达式。_C++_Regex - Fatal编程技术网

正则表达式在c+中不起作用+; 我试图用ReCeEx.在C++中匹配正则表达式。

正则表达式在c+中不起作用+; 我试图用ReCeEx.在C++中匹配正则表达式。,c++,regex,C++,Regex,这是我尝试的模式,在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) {

这是我尝试的模式,在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;
}

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

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

使用与数字匹配的点,而不是使用与非数字匹配的
\D

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

使用与非数字匹配的
\D
,而不是使用与数字匹配的点:

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

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;
        }
    }
}

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;
        }
    }
}

请提供一个或多个输入字符串的例子,当输入的java正则表达式语法在C++标准正则表达式库中有效时,输入字符串与所提供的正则表达式不匹配。你为什么不使用它呢?我试过这个输入“@000172@000002000[000001@13 8”,但它也除了这个“@000456789172@000002000[000001@13 8”我通过STD=C++ 11,但是java正则表达式不工作——UnNythis是C++ +哇……你知道你在使用标准POSIX正则表达式功能而不是标准库中的新正则表达式功能吗?请提供一个或多个输入字符串,当输入java正则表达式时,它与提供的正则表达式不匹配。上面的AX是标准的C++正则表达式库,你为什么不使用它?我尝试了这个输入“@ 000172 @ 00000 2000”[00000 1 @ 13 8 ],但它也不包括这个“@ 000456789172 @ 00000 2000 [00000 1 @ 1””。我通过STD=C++ 11,但是java正则表达式不工作——UnNythis是C++ +哇……你知道你在使用标准POSIX正则表达式功能而不是标准库中的新正则表达式功能吗?我有GCC(Ubuntu5.4.0~6Ubuntu1-16.04.4) 5.4.0 20160609@noman-akhtar在此检查一些基本代码示例,例如:我有gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609@noman-akhtar在此检查一些基本代码示例,例如:点可以匹配任何字符,但\D可以匹配任何非十进制数字的字符,因此我不能将其替换为dot@NomanAkhtar:为什么?请编辑您的问题并添加测试用例。哪些字符串必须匹配,哪些不能匹配?您的正则表达式匹配无限长度数字的th.dot可以匹配任何字符,但\D可以匹配任何非十进制数字的字符,因此我无法将其替换为dot@NomanAkhtar:为什么?请编辑您的问题并添加测试用例。哪些字符串必须匹配,哪些不能匹配?您的正则表达式匹配无限长的数字。