请教下C语言使用regex库正则筛选连续数字/字母的问题

vento_fy 2020-12-19 02:47:35
开发环境:VS2017
使用2.7的regex库,应该是最新的。

regex函数原型
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);

在匹配字符串的过程中,用正则寻找连续数字串,现在遇到两个问题:
1.对于 "we12312332qwwww d1246Xdes"这个字符串,我用"\[0-9]{4}"匹配连续4个数字,但是每次regex只匹配了第一个"1231"就返回了,后续"2332""1246"匹配不到,我填入的pmatch数组参数支持最多25个匹配结果,但是除了第一个有对应字符的信息,其他的都是-1.如果我把第一个1231去掉,又能匹配接下来的2332.
2.有个疑问,假如我匹配“1234”中的连续2个数字串,有办法匹配出"12"、"23"、"34"这样的结果吗?因为我现在想做一个脏数据处理可能要考虑这个。
以上两个问题,希望各位大佬指教


#include <stdio.h>
#include <string.h>
#include "regex.h"

int main(int argc, char *argv[])
{
int len;
regex_t re;
regmatch_t subs[25];
char matched[1024];
char errbuf[128];
int err = 0, i = 0;
char src[1024] = { "we12312332qwwww d1246Xdes" };
char pattern[1024] = { "\[0-9]{4}" };


/*编译正则表达式*/
err = regcomp(&re, pattern, REG_EXTENDED);

if (err)
{
len = regerror(err, &re, errbuf, sizeof(errbuf));
printf("error: regcomp: %s\r\n", errbuf);
return 1;
}
printf("Total has subexpression: %d\n", re.re_nsub);
/*执行模式匹配*/
err = regexec(&re, src, 25, subs, 0);
if (err == REG_NOMATCH)
{
printf("no match...\r\n");
regfree(&re);
return 0;
}
else if (err)
{
len = regerror(err, &re, errbuf, sizeof(errbuf));
printf("error: regexec: %s\r\n", errbuf);
return 1;
}

printf("OK , has matched...\r\n");
for (i = 0; i <= re.re_nsub; i++)
{
len = subs[i].rm_eo - subs[i].rm_so;
if (0 == i)
{
printf("begin: %d, len = %d \r\n",subs[i].rm_so, len);
}
else
{
printf("subexpression %d begin: %d, len = %d ", i, subs[i].rm_so, len);
}
memcpy(matched, src + subs[i].rm_so, len);
matched[len] = '\0';
printf("match: %s\n", matched);
}

regfree(&re);
return 0;

}


...全文
291 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
vento_fy 2020-12-23
  • 打赏
  • 举报
回复
感谢,C++的是可以了。我自己研究下C有没有办法吧。看看有没有办法解决第二个问题。
赵4老师 2020-12-22
  • 打赏
  • 举报
回复
再供参考:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string s("we12312332qwwww  d1246Xdes");
    cout << s << endl;
    cout << "----" << endl;
    regex e("[0-9]{4}");
    smatch m;
    while (regex_search (s,m,e)) {
        cout << m.str() << endl;
        s = m.suffix().str();
    }
    return 0;
}
//we12312332qwwww  d1246Xdes
//----
//1231
//2332
//1246
//
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549
vento_fy 2020-12-22
  • 打赏
  • 举报
回复
引用 2 楼 赵4老师 的回复:
仅供参考:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string s("deabc\ndeab\ndefabc");
    cout << s << endl;
    cout << "----" << endl;
    regex e("abc$");
    smatch m;
    while (regex_search (s,m,e)) {
        cout << m.str() << endl;
        s = m.suffix().str();
    }
    return 0;
}
//deabc
//deab
//defabc
//----
//abc
//abc
//
引用 2 楼 赵4老师 的回复:
仅供参考:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string s("deabc\ndeab\ndefabc");
    cout << s << endl;
    cout << "----" << endl;
    regex e("abc$");
    smatch m;
    while (regex_search (s,m,e)) {
        cout << m.str() << endl;
        s = m.suffix().str();
    }
    return 0;
}
//deabc
//deab
//defabc
//----
//abc
//abc
//
谢谢回复,不过我需要用C语言实现,没法直接用regex库,是额外导入的。还有就是我按照您的代码替换了文本和正则表达式,结果和我之前差不多,第一串数字是一整串出来的。
赵4老师 2020-12-21
  • 打赏
  • 举报
回复
仅供参考:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string s("deabc\ndeab\ndefabc");
    cout << s << endl;
    cout << "----" << endl;
    regex e("abc$");
    smatch m;
    while (regex_search (s,m,e)) {
        cout << m.str() << endl;
        s = m.suffix().str();
    }
    return 0;
}
//deabc
//deab
//defabc
//----
//abc
//abc
//
vento_fy 2020-12-20
  • 打赏
  • 举报
回复
没人会吗。。。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧