Пример #1
0
static bool match_here(struct utf8_iter expr, struct utf8_iter text, char **end) {
	unsigned pre = expr.chr;
	int flags = 0;

	if (pre == 0) {
		if (end != NULL)
			*end = text.head;

		return true;
	}

	if (pre == '~') {
		pre = utf8_next(&expr);
		flags |= NEGATE;
	}

	if (pre == '%') {
		pre = utf8_next(&expr);

		switch (pre) {
		case 'a': /* alpha */
		case 'd': /* digit */
		case 'f': /* float */
		case 'g': /* graphic */
		case 'n': /* newline */
		case 's': /* space */
		case 'x': /* hex */
		case '?': /* anything */
			flags |= CLASS;
		}
	}

	utf8_next(&expr);

	if (expr.chr == '*') {
		utf8_next(&expr);
		return match_star(pre, flags, expr, text, end);
	} else if (expr.chr == '+') {
		utf8_next(&expr);
		return match_plus(pre, flags, expr, text, end);
	}

	if (pre == '$' && expr.chr == 0) {
		if (end != NULL)
			*end = text.head;

		return text.chr == 0;
	}

	if (text.chr != 0 && match_char(pre, flags, &text)) {
		utf8_next(&text);
		return match_here(expr, text, end);
	}

	return false;
}
bool match_here(const std::string& str, int a, const std::string& regex, int b)
{
    if (b == regex.size()) {
        return true;
    }
    if (b == regex.size() - 1 && regex[b] == '$') {
        return a == (str.size()-1);
    }
    if (regex.size() - b >= 2 && regex[b + 1] == '*') {
        return match_star(regex[b], str, a, regex, b+2);
    }
    if (a != str.size() && (str[a] == regex[b] || regex[b] == '.')) {
        return match_here(str, a + 1, regex, b + 1);
    }
    return false;
}