user-0 提问: linux c正则表达式，我在用C做一个邮箱的正则表达式匹配，不知道为什么匹配不过

回复:
user: user-0
content: 另外的话赵四老师给的例子是windows下面C++的正则表达式匹配，其实开始我也是用的这个，但是移植到linux下面就不行了，所以就开始研究linux下的POSIX  C  正则表达式，http://blog.csdn.net/echo_qiang/article/details/5907679这篇博客说的比较详细，但是其中有些内容是错误的，不过最后慢慢摸索成功了，还好。

user: user-0
content: 楼上的str字符串写错了，应该为： string str = "futu-i!#$%&’*+/=?^_`{|}~-n_c.n_n@futu5-h_eheda.c_-om.c_-n.g-g.si-_mida.x-_ixi";

user: user-0
content: 哎，赵四老师果然英明神武，给你分啦，最后我发现每部分都加（）就能匹配了，不知道是不是和POSIX的规则有关系，以下是我准备使用的代码，    char heheda[4096*1024];     //FILE *file = fopen("/home/iversonzhang/testfile/allemail.txt","r");     //FILE *out  = fopen("/home/iversonzhang/testfile/outfile.txt","w");     const char * str2 = "^([[:space:]]*[[:alnum:].!#$%&’*+/=?^_`{|}~-]+)@([[:alnum:]/_/-]+)(([/.][[:alnum:]/_/-]+){1,64}[[:space:]]*)$";     string str = "futu-i!#$%&’*+/=?^_`{|}~-]+n_c.n_n@futu5-h_eheda.c_-om.c_-n.g-g.si-_mida.x-_ixi";     const char * str1 = str.c_str();     //size_t filesize = fread(heheda, sizeof(char), sizeof(heheda), file);     //printf("filesize:%d; %d\n",filesize,4096*1024);     regex_t comment;     size_t nmatch;     regmatch_t regmatch[100];          int i = regcomp(&comment, str2, REG_EXTENDED);     if(i !=0){ 	    printf("i:%d\n",i);     }     int j;     j = regexec(&comment,str,99,regmatch,0);     if(j != 0)     { 		printf("j:%d\n",j); 		return 0;     }     //输出匹配字串     for(int i = 0; i< 100 && regmatch[i].rm_so!= -1;i++)     {            char aa[100];         strncpy(aa, str1+regmatch[i].rm_so, regmatch[i].rm_eo - regmatch[i].rm_so);         aa[regmatch[i].rm_eo-regmatch[i].rm_so]='\0';         printf("%s\n",aa);     }     regfree(&comment);     return 0;

user: user-1
content: 仅供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string str("This expression could match from A and beyond. [ expression  express ]");     string rs = "exp\\w*";  // 正则字符串，exp开始的单词     cout << str << endl;      regex expression(rs); // 字符串传递给构造函数，建立正则表达式  // regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。 // 注意，这个正则表达式必须匹配被分析串的全部，否则函数返回 false. // 如果整个序列被成功匹配，regex_match 返回 True.     bool ret = regex_match(str, expression);     if (ret)         cout << "可以匹配整个文本" << endl;     else         cout << "不能匹配整个文本" << endl;  // regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。 // 你可以用 regex_search 来查找输入中的一个子序列，该子序列匹配正则表达式 e.     ret = regex_search(str, expression);     if (ret)         cout << "能够搜索到 " << rs << endl;     else         cout << "不能搜索" << endl;  // regex_replace 在整个字符序列中查找正则表达式e的所有匹配。 // 这个算法每次成功匹配后，就根据参数fmt对匹配字符串进行格式化。 // 缺省情况下，不匹配的文本不会被修改，即文本会被输出但没有改变。      str = regex_replace(str, expression, string("表达式")); // VC2010或者TR1注意：这里第三个参数要用string()转换 // http://www.johndcook.com/cpp_regex.html // started with C++ TR1 regular expressions     cout << str << endl;     return 0; } //This expression could match from A and beyond. [ expression  express ] //不能匹配整个文本 //能够搜索到 exp\w* //This 表达式 could match from A and beyond. [ 表达式  表达式 ]

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。