SYNOPSIS
        #include <regexp.h>

        string   regmatch(string text, string pattern)
        string   regmatch(string text, string pattern, int opt)
        string   regmatch(string text, string pattern, int opt, int start)
        string * regmatch(string text, string pattern, int opt)
        string * regmatch(string text, string pattern, int opt, int start)

DESCRIPTION
        Match the string <txt> against <pattern> (interpreted according
        to <opt> if given). If <start> is given, it is the start
        position for the match and must be in the range [0..strlen(text)].

        If there is no match, the result is 0. If there is a match, the exact
        result is determined by the flag RE_MATCH_SUBS:

        If the flag RE_MATCH_SUBS is not set, the result is the matched
        expression.

        If the flag RE_MATCH_SUBS is set, the result is an array of the
        matched string(s) of the first match. Entry [0] is the full string
        matching the <pattern>, following entries are the string segments
        matching parenthesized subexpressions in <pattern>. If a particular
        subexpression didn't have a match, the corresponding array entry will
        be 0.

        The last entry in the array will be the new start index in case you
        want to repeat the match on the remaining parts of the string. This
        new index is usually equal the length of the match, but at least one
        higher than the original start index.


EXAMPLES
        regmatch("abcdefcdf", "cd")    -> "cd"
        regmatch("abcdefcdf", "cd(e)") -> "cde"

        regmatch("abcdefcdf", "cd", RE_MATCH_SUBS)    -> ({ "cd" })
        regmatch("abcdefcdf", "cd(e)", RE_MATCH_SUBS) -> ({ "cde", "e" })

HISTORY
        Introduced in LDMud 3.3.198.
        Modified in 3.3.214 to return 0 for non-matches, and to take and
        return a start position.
        Since 3.5.0 a error is raised if RE_PCRE is specified in <opt>, but
        the driver lacks PCRE support.

SEE ALSO
        regexplode(E), regreplace(E), regexp(E), regexp_package(E), regexp(C)
