Good question, and here's something I wrote a couple weeks ago to the author of the Regex Lingua Franca paper [1]:
I admit I occasionally use non-greedy repetition in Python, but I think that is the only construct I use that's not in the shell-ish engines. I believe it's usually pretty easy to rewrite without non-greedy, but I haven't tested that theory.
----
OK so I started testing that theory. I collected all the times I used
.*?
https://github.com/oilshell/blog-code/blob/master/regular-la...With a cursory inspection, most of them are unnecessary in an automata-based "regular language" engine.
They are "nice to have" in a Perl-style regex engine for PERFORMANCE. But automata-based engines don't have that performance problem. They don't backtrack.
The distinction between .* and .*? doesn't affect whether it matches or not, by definition. It does affects how much it backtracks. (And it affects where the submatches are, which I need to test out)
So I think most of my own usages ARE "nice to have" in Python, but unnecessary in awk because it uses an automata-based engine.
But I'd like to look at it more carefully, and I'm interested in answering this question more thoroughly (feel free to contact me about it, e-mail in profile).
I started a demo here. Still needs work.
https://github.com/oilshell/blog-code/blob/master/regular-la...
----
So here's another conjecture: regexes are bad because they force you to make UNNECESSARY DISTINCTIONS in the name of performance.
You have to care about greedy vs. nongreedy, because there is backtracking.
In contrast, with regular languages, you just write what you mean, and they do it quickly for you. You can't write a slow expression for a regular language.
There are some caveats around that, like submatch extraction with nongreedy repetition, which I will test out. If anyone has specific examples or use cases, send them my way.
I can't see where I really rely on nongreedy submatches, but I'll have to look more closely. I think the nongreedy use case is usually just "skip quickly until this other string appears", e.g. the one in pgen2/tokenize.py that I didn't write.
----
As far as I remember submatch extraction works fine in automata-based engines, and Cox's articles are in a large part about the (then) little known algorithms for doing it in automata-based engines. re2c also has a 2017 paper for their algorithm to do it in DFAs:
http://re2c.org/2017_trofimovich_tagged_deterministic_finite...
----
[1] thread: https://news.ycombinator.com/item?id=23687478