Variable-Length Lookbehind Assertions in Regular Expressions
Regular expressions provide powerful pattern matching capabilities, but the implementation of variable-length lookbehind assertions has long been a topic of debate.
Implementations with Lookbehind Assertions
Currently, variable-length lookbehind assertions are supported by the regex module in Python. The syntax is (?
<code class="python">>>> import regex >>> m = regex.search('(?<!foo.*)bar', 'f00bar') >>> print(m.group()) bar >>> m = regex.search('(?<!foo.*)bar', 'foobar') >>> print(m) None</p> <p><strong>Alternatives Without Lookbehind Assertions</strong></p> <p>In the absence of lookbehind assertions, there are two alternatives:</p> <ul> <li> <p><strong>K (Keep):</strong> This symbol marks a point in the pattern before which any matched characters are discarded before substitution or grouping.</p> <pre class="brush:php;toolbar:false">s/(?<=foo.*)bar/moo/s;
Becomes:
s/foo.*\Kbar/moo/s;
Negative Lookahead: This technique uses a negative lookahead to check for the absence of "foo".
s/(?<!foo.*)bar/moo/s;
Becomes:
s/^(?:(?!foo).)*\Kbar/moo/s;
Future Implementations
The absence of variable-length lookbehind assertions in mainstream languages like Perl and JavaScript has raised questions about future implementation. It is possible that one day these languages will adopt an enhanced regular expression module similar to Python's regex.
Limitations of Alternatives
Additional Questions
The above is the detailed content of Variable-Length Lookbehind Assertions: The Future of Regular Expressions?. For more information, please follow other related articles on the PHP Chinese website!