Regular Expression - Implementations and Running Times

Implementations and Running Times

There are at least three different algorithms that decide if and how a given regular expression matches a string.

The oldest and fastest rely on a result in formal language theory that allows every nondeterministic finite automaton (NFA) to be transformed into a deterministic finite automaton (DFA). The DFA can be constructed explicitly and then run on the resulting input string one symbol at a time. Constructing the DFA for a regular expression of size m has the time and memory cost of O(2m), but it can be run on a string of size n in time O(n). An alternative approach is to simulate the NFA directly, essentially building each DFA state on demand and then discarding it at the next step. This keeps the DFA implicit and avoids the exponential construction cost, but running cost rises to O(m2n). The explicit approach is called the DFA algorithm and the implicit approach the NFA algorithm. Adding caching to the NFA algorithm is often called the "lazy DFA" algorithm, or just the DFA algorithm without making a distinction. These algorithms are fast, but using them for recalling grouped subexpressions, lazy quantification, and similar features is tricky.

The third algorithm is to match the pattern against the input string by backtracking. This algorithm is commonly called NFA, but this terminology can be confusing. Its running time can be exponential, which simple implementations exhibit when matching against expressions like (a|aa)*b that contain both alternation and unbounded quantification and force the algorithm to consider an exponentially increasing number of sub-cases. This behavior can cause a security problem called Regular expression Denial of Service.

Although backtracking implementations only give an exponential guarantee in the worst case, they provide much greater flexibility and expressive power. For example, any implementation which allows the use of backreferences, or implements the various extensions introduced by Perl, must include some kind of backtracking. Some implementations try to provide the best of both algorithms by first running a fast DFA algorithm, and revert to a potentially slower backtracking algorithm only when a backreference is encountered during the match.

Read more about this topic:  Regular Expression

Famous quotes containing the words running and/or times:

    Swan/Mary Rutledge: Oh no, no. I’m not running away. I came here to get something, and I’m going to get it.
    Col. Cobb: Yes, but San Francisco is no place for a woman.
    Swan: Why not? I’m not afraid. I like the fog. I like this new world. I like the noise of something happening.... I’m tired of dreaming, Colonel Cobb. I’m staying. I’m staying and holding out my hands for gold—bright, yellow gold.
    Ben Hecht (1893–1964)

    Preschoolers think and talk in concrete, literal terms. When they hear a phrase such as “losing your temper,” they may wonder where the lost temper can be found. Other expressions they may hear in times of crisis—raising your voice, crying your eyes out, going to pieces, falling apart, picking on each other, you follow in your father’s footsteps—may be perplexing.
    Ruth Formanek (20th century)