fork download
  1. #include <stdio.h>
  2. #include <regex.h>
  3. //
  4. #define restrict /**/
  5. //
  6. //
  7. int
  8. regex_match (char *restrict pattern,
  9. const char *restrict string,
  10. size_t sub_size, char *restrict sub[restrict],
  11. int cflags, int eflags, int verbose)
  12. {
  13. const int msg_size = 200;
  14. char msg[msg_size];
  15. //
  16. regmatch_t pmatch[sub_size];
  17. size_t n;
  18. size_t m;
  19. size_t d;
  20. //
  21. int status;
  22. regex_t re;
  23. //
  24. status = regcomp (&re, pattern, cflags);
  25. //
  26. if (status != 0)
  27. {
  28. if (verbose)
  29. {
  30. regerror (status, &re, msg, msg_size);
  31. fprintf (stderr, "%s\n", msg);
  32. }
  33. return (status);
  34. }
  35. //
  36. status = regexec (&re, string, sub_size, pmatch,
  37. eflags);
  38. //
  39. if (status != 0)
  40. {
  41. if (verbose)
  42. {
  43. regerror (status, &re, msg, msg_size);
  44. fprintf (stderr, "%s\n", msg);
  45. }
  46. }
  47. else
  48. {
  49. for (n=0; n < sub_size; n++)
  50. {
  51. for (d = 0, m = pmatch[n].rm_so;
  52. m >= 0 && m < pmatch[n].rm_eo;
  53. m++, d++)
  54. {
  55. sub[n][d] = string[m];
  56. }
  57. sub[n][d] = '\0';
  58. }
  59. }
  60. //
  61. regfree (&re);
  62. //
  63. return (status);
  64. }
  65. //
  66. //
  67. //
  68. int
  69. main (void)
  70. {
  71. int result;
  72. char *string = "Ciao amore mio";
  73. char *re = "Ciao (amo)re";
  74. char sub0[200];
  75. sub0[0] = '\0';
  76. char sub1[200];
  77. sub1[0] = '\0';
  78. char *sub[] = {sub0, sub1};
  79. //
  80. result = regex_match (re, string, 2, sub, REG_EXTENDED,
  81. 0, 1);
  82. //
  83. if (result == 0)
  84. {
  85. printf ("Il modello \"%s\" trova corrispondenza ",
  86. re);
  87. printf ("nella stringa \"%s\", precisamente ",
  88. string);
  89. printf ("nella porzione \"%s\", mentre la ",
  90. sub[0]);
  91. printf ("sottostringa estratta è \"%s\".\n",
  92. sub[1]);
  93. }
  94. else
  95. {
  96. printf ("Il modello \"%s\" ", re);
  97. printf ("NON trova corrispondenza ");
  98. printf ("nella stringa \"%s\"\n", string);
  99. }
  100. return 0;
  101. }
Success #stdin #stdout 0.01s 1852KB
stdin
Standard input is empty
stdout
Il modello "Ciao (amo)re" trova corrispondenza nella stringa "Ciao amore mio", precisamente nella porzione "Ciao amore", mentre la sottostringa estratta è "amo".