SYNOPSIS
        Henry Spencer Regular Expressions

DESCRIPTION
        This document describes the regular expressions supported by the
        implementation by Henry Spencer (the traditional package for
        LPMud).

OPTIONS
        The following bitflag options modify the behaviour of the
        regular expressions - both interpretation and actual matching.

        The efuns may understand additional options.

          RE_EXCOMPATIBLE

        If this bit is set, the pattern is interpreted as the UNIX ed
        editor would do it: () match literally, and the \( \) group
        expressions.

REGULAR EXPRESSION DETAILS
        A regular expression is a pattern that is matched against  a
        subject string from left to right. Most characters stand for
        themselves in a pattern, and match the corresponding charac-
        ters in the subject. As a trivial example, the pattern

          The quick brown fox

        matches a portion of a subject string that is  identical  to
        itself.  The  power  of  regular  expressions comes from the
        ability to include alternatives and repetitions in the  pat-
        tern.  These  are encoded in the pattern by the use of meta-
        characters, which do not stand for  themselves  but  instead
        are interpreted in some special way.

        There are two different sets of meta-characters: those  that
        are  recognized anywhere in the pattern except within square
        brackets, and those that are recognized in square  brackets.
        Outside square brackets, the meta-characters are as follows:

          .       Match any character.

          ^       Match begin of line.

          $       Match end of line.

          \<      Match begin of word.

          \>      Match end of word.

          \B      not at edge of a word (supposed to be like the emacs
                  compatibility one in gnu egrep)

          x|y     Match regexp x or regexp y.

          ()      Match enclosed regexp like a 'simple' one (unless
                  RE_EXCOMPATIBLE is set).

          x*      Match any number (0 or more) of regexp x.

          x+      Match any number (1 or more) of regexp x.

          [..]    Match one of the characters enclosed.

          [^ ..]  Match none of the characters enclosed. The .. are to
                  replaced by single characters or character ranges:

          [abc]   matches a, b or c.

          [ab0-9] matches a, b or any digit.

          [^a-z]  does not match any lowercase character.

          \c      match character c even if it's one of the special
                  characters.

NOTES
        The \< and \> metacharacters from Henry Spencers package
        are not available in PCRE, but can be emulate with \b,
        as required, also in conjunction with \W or \w.

        In LDMud, backtracks are limited by the EVAL_COST runtime
        limit, to avoid freezing the driver with a match
        like regexp(({"=XX==================="}), "X(.+)+X").

AUTHOR
        Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
        Henry Spencer, University of Torronto (henry@utzoo.edu)
        Joern Rennecke
        Ian Phillipps

SEE ALSO
        regexp(C), pcre(C)
