summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/regex_match.c
blob: def0ae7a6d06eddb51518099d9121fe73494117d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define i_extern
#include <stc/cregex.h>
#include <stc/csview.h>

#define i_val float
#include <stc/cstack.h>

int main()
{
    // Lets find the first sequence of digits in a string
    const char *str = "Hello numeric world, there are 24 hours in a day, 3600 seconds in an hour."
                      " Around 365.25 days a year, and 52 weeks in a year."
                      " Boltzmann const: 1.38064852E-23, is very small."
                      " Bohrradius is 5.29177210903e-11, and Avogadros number is 6.02214076e23.";
    cregex re = {0};
    cstack_float vec = {0};

    const char* pattern = "[+-]?([0-9]*\\.)?\\d+([Ee][+-]?\\d+)?";
    int res = cregex_compile(&re, pattern);
    printf("%d: %s\n", res, pattern);

    // extract and convert all numbers in str to floats
    c_formatch (i, &re, str)
        cstack_float_push(&vec, (float)atof(i.match[0].str));

    c_foreach (i, cstack_float, vec)
        printf("  %g\n", *i.ref);

    // extracts the numbers only to a comma separated string.
    cstr nums = cregex_replace_sv(&re, csview_from(str), " $0,", 0, NULL, CREG_R_STRIP);
    printf("\n%s\n", cstr_str(&nums));

    cstr_drop(&nums);
    cregex_drop(&re);
    cstack_float_drop(&vec);
}