.{5}
would match any string of 5 symbols (excluding newline). Suppose I wanted to define "a 5-character repetition of a single character."
The immediate way that comes to mind is (.)\1{4}
, but this relies on a back reference.
Using a subset of regex which is dependent only on |,(),*,concat
any regex expression of pattern size M
and search string size N
can be solved with a means an M
-size NFA in O(NM)
time.
Backreferences, unlike +, {n}, etc.
are not derivable from the restricted regex tools above, and result in exponential times.
Is it possible to replicate the desired pattern in the non-exponential-time subset of regex (without using exponential* size)? If not, then why (how can we prove so)?
*one could go factorial in size by brute-forcing in this case.
.{r5}
would expand into a5*n
NFA where n is the size of the alphabet, it would quickly get out of hand $\endgroup$\1
is not backtracking but backrefrencing. You can make it without backtracking:(.)\1{10}
on stringaaaaaaaaaaa
takes 3 steps, however(.)(?1){10}
takes 22 steps to match. $\endgroup$