Next: regexps errors, Previous: regexps inspection, Up: regexps [Contents][Index]
If rex is a successfully built regular expression object: return a
non–negative integer representing the number of capturing groups
(parenthetical subexpressions) in the pattern. If an error occurred
while building rex: return -1
.
If rex is a successfully built regular expression object: return a non–negative integer
representing the index of the named capturing group whose name is name. If an error occurred
while building rex or the name is invalid: return -1
.
const char * pattern = "from (?P<S>.*) to (?P<D>.*)"; cre2_options_t * opt = cre2_opt_new(); cre2_regexp_t * rex = cre2_new(pattern, strlen(pattern), opt); { if (cre2_error_code(rex)) { /* handle the error */ } int nmatch = cre2_num_capturing_groups(rex) + 1; cre2_string_t strings[nmatch]; int e, SIndex, DIndex; const char * text = \ "from Montreal, Canada to Lausanne, Switzerland"; int text_len = strlen(text); e = cre2_match(rex, text, text_len, 0, text_len, CRE2_UNANCHORED, strings, nmatch); if (0 == e) { /* handle the error */ } SIndex = cre2_find_named_capturing_groups(rex, "S"); if (0 != strncmp("Montreal, Canada", strings[SIndex].data, strings[SIndex].length)) { /* handle the error */ } DIndex = cre2_find_named_capturing_groups(rex, "D"); if (0 != strncmp("Lausanne, Switzerland", strings[DIndex].data, strings[DIndex].length)) { /* handle the error */ } } cre2_delete(rex); cre2_opt_delete(opt);
Build and return a new named capturing groups iterator.
Finalise and delete a named capturing groups iterator.
Search the next named capturing group.
When a group is found: return true
; store in the variable referenced by namep a pointer to
the string representing the name; store in the variable referenced by indexp an integer
representing the index of the capturing group.
When no more groups are present: return false
; store NULL
in the variable referenced by
namep; store ‘-1’ in the variable referenced by indexp.
As example, let’s see this:
cre2_regexp_t * rex = NULL; cre2_named_groups_iter_t * iter = NULL; const char rex_pattern[] = "\ January:[[:blank:]]+(?P<january>[[:digit:]]+)\n\ February:[[:blank:]]+(?P<january>[[:digit:]]+)\n\ March:[[:blank:]]+(?P<march>[[:digit:]]+)\n\ April:[[:blank:]]+(?P<april>[[:digit:]]+)\n\ May:[[:blank:]]+(?P<may>[[:digit:]]+)\n\ June:[[:blank:]]+(?P<june>[[:digit:]]+)\n\ July:[[:blank:]]+(?P<july>[[:digit:]]+)\n\ August:[[:blank:]]+(?P<august>[[:digit:]]+)\n\ September:[[:blank:]]+(?P<september>[[:digit:]]+)\n\ October:[[:blank:]]+(?P<october>[[:digit:]]+)\n\ November:[[:blank:]]+(?P<november>[[:digit:]]+)\n\ December:[[:blank:]]+(?P<december>[[:digit:]]+)\n"; const char * text = "\ January: 8\n\ February: 3\n\ March: 3\n\ April: 4\n\ May: 9\n\ June: 4\n\ July: 7\n\ August: 5\n\ September: 9\n\ October: 2\n\ November: 1\n\ December: 6\n"; int text_len = strlen(text); int rv; int nmatch = 20; cre2_string_t match[nmatch]; /* Let's build the regular expression. */ rex = cre2_new(rex_pattern, strlen(rex_pattern), NULL); if (!rex) { goto done; } if (cre2_error_code(rex)) { goto done; } /* Now match the pattern. */ rv = cre2_match(rex, text, text_len, 0, text_len, CRE2_ANCHOR_BOTH, match, nmatch); if (! rv) { goto done; } /* Build the named groups iterator. */ iter = cre2_named_groups_iter_new(rex); if (!iter) { goto done; } /* Perform the iteration. */ { char const *name; int index; while (cre2_named_groups_iter_next(iter, &name, &index)) { printf("group: %d, %s\n", index, name); } } /* Final cleanup. */ done: if (iter) { cre2_named_groups_iter_delete(iter); } if (rex) { cre2_delete(rex); }
this code prints:
group: 4, april group: 8, august group: 12, december group: 1, january group: 7, july group: 6, june group: 3, march group: 5, may group: 11, november group: 10, october group: 9, september
Next: regexps errors, Previous: regexps inspection, Up: regexps [Contents][Index]
This document describes version 0.4.0-devel.2 of CRE2.