正则表达式在c+中不起作用+; 我试图用ReCeEx.在C++中匹配正则表达式。
这是我尝试的模式,在java中运行良好正则表达式在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) {
(^.*([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:为什么?请编辑您的问题并添加测试用例。哪些字符串必须匹配,哪些不能匹配?您的正则表达式匹配无限长的数字。