我正在尝试使用 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;
}
答案 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更新到更新的版本解决了这个问题。