#include <stdio.h>
int matchstar(int c, char *regexp, char*text);
int matchhere(char *regexp, char *text);
int match(char *regexp, char *text)
{
if (regexp[0] == '^')
return matchhere(regexp+1, text);
do {
if (matchhere(regexp, text))
return 1;
} while (*text++ != '\0');
return 0;
}
int matchstar(int c, char *regexp, char*text)
{
do {
if (matchhere(regexp, text))
return 1;
} while (*text != '\0' && (*text++ == c || c == '.'));
return 0;
}
int matchhere(char *regexp, char *text)
{
if (regexp[0] == '\0')
return 1;
if (regexp[1] == '*')
return matchstar(regexp[0], regexp+2, text);
if (regexp[0] == '$' && regexp[1] == '\0')
return *text == '\0';
if (*text != '\0' && (regexp[0] == '.' || regexp[0] == *text))
return matchhere(regexp+1, text+1);
return 0;
}
void test(char *regexp, char *text, int expected)
{
int res = match(regexp, text);
if (res == expected)
else
printf("\t/%s ~ %s\t", regexp
, text
); if (res)
else
}
int main()
{
test("a..*bb.*cd", "aababbcd", 1);
test("a..*bb.*cd", "abcd", 0);
test("a..*bb.*cd", "aa.bxcxd", 0);
test("a.*.b.*c.*d", "abcd", 0);
test("a.*.b.*c.*d", "aabcd", 1);
test("a.*.b.*c.*d", "a.bcd", 1);
test("a.*.b.*c.*d", "aa.bxcxd", 1);
test("a.*.b.*c.*d", "aa.bxcd", 1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgbWF0Y2hzdGFyKGludCBjLCBjaGFyICpyZWdleHAsIGNoYXIqdGV4dCk7CmludCBtYXRjaGhlcmUoY2hhciAqcmVnZXhwLCBjaGFyICp0ZXh0KTsKCmludCBtYXRjaChjaGFyICpyZWdleHAsIGNoYXIgKnRleHQpCnsKICAgICAgICBpZiAocmVnZXhwWzBdID09ICdeJykKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGhlcmUocmVnZXhwKzEsIHRleHQpOwogICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGhlcmUocmVnZXhwLCB0ZXh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSB3aGlsZSAoKnRleHQrKyAhPSAnXDAnKTsKICAgICAgICByZXR1cm4gMDsKfQoKaW50IG1hdGNoc3RhcihpbnQgYywgY2hhciAqcmVnZXhwLCBjaGFyKnRleHQpCnsKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hoZXJlKHJlZ2V4cCwgdGV4dCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gd2hpbGUgKCp0ZXh0ICE9ICdcMCcgJiYgKCp0ZXh0KysgPT0gYyB8fCBjID09ICcuJykpOwogICAgICAgIHJldHVybiAwOwp9CgppbnQgbWF0Y2hoZXJlKGNoYXIgKnJlZ2V4cCwgY2hhciAqdGV4dCkKewogICAgICAgIGlmIChyZWdleHBbMF0gPT0gJ1wwJykKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmIChyZWdleHBbMV0gPT0gJyonKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoc3RhcihyZWdleHBbMF0sIHJlZ2V4cCsyLCB0ZXh0KTsKICAgICAgICBpZiAocmVnZXhwWzBdID09ICckJyAmJiByZWdleHBbMV0gPT0gJ1wwJykKICAgICAgICAgICAgICAgIHJldHVybiAqdGV4dCA9PSAnXDAnOwogICAgICAgIGlmICgqdGV4dCAhPSAnXDAnICYmIChyZWdleHBbMF0gPT0gJy4nIHx8IHJlZ2V4cFswXSA9PSAqdGV4dCkpCiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hoZXJlKHJlZ2V4cCsxLCB0ZXh0KzEpOwogICAgICAgIHJldHVybiAwOwp9Cgp2b2lkIHRlc3QoY2hhciAqcmVnZXhwLCBjaGFyICp0ZXh0LCBpbnQgZXhwZWN0ZWQpCnsKICAgICAgICBpbnQgcmVzID0gbWF0Y2gocmVnZXhwLCB0ZXh0KTsKICAgICAgICBpZiAocmVzID09IGV4cGVjdGVkKQogICAgICAgICAgICAgICAgcHJpbnRmKCJbIE9LIF0iKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludGYoIltGQUlMXSIpOwogICAgICAgIHByaW50ZigiXHQvJXMgfiAlc1x0IiwgcmVnZXhwLCB0ZXh0KTsKICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgICAgcHJpbnRmKCJtYXRjaGluZyIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50Zigibm90IG1hdGNoaW5nIik7CiAgICAgICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbigpCnsKICAgICAgICB0ZXN0KCJhLi4qYmIuKmNkIiwgImFhYmFiYmNkIiwgMSk7CiAgICAgICAgdGVzdCgiYS4uKmJiLipjZCIsICJhYmNkIiwgMCk7CiAgICAgICAgdGVzdCgiYS4uKmJiLipjZCIsICJhYS5ieGN4ZCIsIDApOwoKICAgICAgICB0ZXN0KCJhLiouYi4qYy4qZCIsICJhYmNkIiwgMCk7CiAgICAgICAgdGVzdCgiYS4qLmIuKmMuKmQiLCAiYWFiY2QiLCAxKTsKICAgICAgICB0ZXN0KCJhLiouYi4qYy4qZCIsICJhLmJjZCIsIDEpOwogICAgICAgIHRlc3QoImEuKi5iLipjLipkIiwgImFhLmJ4Y3hkIiwgMSk7CiAgICAgICAgdGVzdCgiYS4qLmIuKmMuKmQiLCAiYWEuYnhjZCIsIDEpOwoKICAgICAgICByZXR1cm4gMDsKfQo=