diff options
| author | patrick-scho | 2025-05-23 13:40:28 +0200 |
|---|---|---|
| committer | patrick-scho | 2025-05-23 16:08:34 +0200 |
| commit | 6f2e28e44c3d1552a12b4e3d92f9d4788d5aab09 (patch) | |
| tree | 1b71ae6dd486df1c0d69a92faf70f24b50d4d8ac /regex.c | |
| download | onefile-6f2e28e44c3d1552a12b4e3d92f9d4788d5aab09.tar.gz onefile-6f2e28e44c3d1552a12b4e3d92f9d4788d5aab09.zip | |
add regex.c
Diffstat (limited to 'regex.c')
| -rw-r--r-- | regex.c | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -0,0 +1,49 @@ +int match(char r, char t) +{ + return r == '.' || r == t; +} +int matchstr(const char *r, const char *t) +{ + int state = 0, i = (r[0] == '^' ? 1 : 0), j = 0; + while (1) + { + if (r[i] == '\0') + return 1; + if (r[i] == '$' && r[i + 1] == '\0') + return t[j] == '\0'; + if (t[j] == '\0') + return 0; + + if (state == 0) // base case + { + if (r[i + 1] == '*') + state = 1; + else if (match(r[i], t[j])) + i++, j++; + else if (r[0] == '^') + return 0; + else + i = 0; + } + if (state == 1) // star + { + if (!match(r[i], t[j]) || match(r[i + 2], t[j])) + state = 0, i += 2; + else + j++; + } + } + return 0; +} + +#include <stdio.h> + +int main(int argc, char **argv) +{ + if (argc != 3) + { + printf("Usage: %s <regex> <text>\n", argv[0]); + return 2; + } + return !matchstr(argv[1], argv[2]); +} |
