- 论坛徽章:
- 0
|
- 1.#include <stdio.h>
- 1.#include <strings.h>
- 2.#include <regex.h>
- 3.
- 4.char *string = " i love you love baby ";
- 5.
- 6.//截取子字符串
- 7.char* substring(const char* str, size_t begin, size_t len)
- 8.{
- 9. if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
- 10. return 0;
- 11.
- 12. return strndup(str + begin, len); //使用strndup()出来的字符串,需要free()
- 13.}
- 14.
- 15.//正则匹配, 只搜索字符串中第一个符合的子字符串
- 16.int regex_search(const char *str, const char *regex, regmatch_t pmatch[], int nmatch)
- 17.{
- 18. regex_t preg;
- 19.
- 20. bzero(&preg, sizeof(regex_t));
- 21.
- 22. if(regcomp(&preg, regex, REG_EXTENDED) == 0)
- 23. {
- 24. if(regexec(&preg, str, nmatch, pmatch, 0) == 0)
- 25. return 0;
- 26. else
- 27. return -1;
- 28. }
- 29. else
- 30. {
- 31. return -2;
- 32. }
- 33.}
- 34.
- 35.//统计符合正则的子字符串的所有个数
- 36.int substr_count(char *str, const char *sub)
- 37.{
- 38. int i=0;
- 39. char *p = str;
- 40. while(p)
- 41. {
- 42. if((p=strstr(p,sub)))
- 43. {
- 44. i++;
- 45. p+=strlen(sub);
- 46. }
- 47. else
- 48. {
- 49. break;
- 50. }
- 51. }
- 52. return i;
- 53.}
- 54.
- 55.
- 56.int main()
- 57.{
- 58. //正则表达式
- 59. char *regex = "lo(v)(e)";
- 60. int i=0,len=0;
- 61.
- 62. //统计左括号的个数,用于判断正则表达式中有多少(),+1是因为除()外,整个正则字符串也算一个, 虽然不准,但也可以
- 63. int nmatch = substr_count(regex, "(")+1;
- 64.
- 65. //根据regex中的()个数,设置一次正则匹配会有多少个分组
- 66. regmatch_t pmatch[nmatch];
- 67.
- 68. int k=0;
- 69. int ind=0;
- 70. int j = 0;
- 71. //循环进行正则匹配
- 72. for( j=0; j<strlen(string); )
- 73. {
- 74. char *p;
- 75.
- 76. p=string+j;
- 77. //单次正则匹配
- 78. if(regex_search(p, regex, pmatch, nmatch) == 0)
- 79. {
- 80. //遍历单次匹配的所有分组
- 81. for(i=0; i<nmatch;i++)
- 82. {
- 83. //单分组的模式匹配开始位置
- 84. if(pmatch[i].rm_so == -1 )
- 85. continue;
- 86.
- 87. //第一个分组是整个完整正则表达式 l(o)(v)e匹配,比如 "i love you love you" ,记录love中e的位置,赋给p,用于对后面的字符串继续匹配正则
- 88. if(i==0)
- 89. j=j+pmatch[i].rm_eo;
- 90.
- 91. //获取匹配串的长度
- 92. len = (pmatch[i].rm_eo - pmatch[i].rm_so);
- 93.
- 94. //输出字符串
- 95. printf("found %lld-%lld %s \n", pmatch[i].rm_so, pmatch[i].rm_eo,substring(p,(int)pmatch[i].rm_so, (int)(pmatch[i].rm_eo - pmatch[i].rm_so) ));
- 96. }
- 97. }
- 98. else
- 99. {
- 100. break;
- 101. }
- 102. }
- 103. return 0;
- 104.}
- 105.
- 106.//输出
- 107.userdeMac:stardict user$ ./a.out
- 108.found 3-7 love
- 109.found 5-6 v
- 110.found 6-7 e
- 111.
- 112.found 5-9 love
- 113.found 7-8 v
- 114.found 8-9 e
复制代码 |
|