Suppose I have a simple regular expression describing a language like $(a+b)^* a?b (a+b)^*$ (a language in $\Sigma = \{a,b\}$ consisting of all words with substring $a?b$). I haven't found a general way to negate any regular expression, and it seems that no such way exists. There is similar question: A regular expression for the words that don't contain the sequence $ab$ over $\{a,b,c\}$, but the way described there quickly becomes very complicated when regular expression length increases. How to deal with this?
Asked
Active
Viewed 1,248 times
1
1 Answers
2
Convert the regular expression to a finite automaton accepting $L$. Then interchange accepting and non-accepting states, which produces an automaton accepting $\Sigma^*\setminus L$. Finally, convert the automaton to a regular expression.
Hagen von Eitzen
- 374,180
-
It's not so easy to build a DFA for $a?b$, and for NFA it's not easy to build a regex... – aplavin Sep 09 '12 at 11:02
-
2@chersanya: The regex-to-DFA is easy enough (and in most practical cases ends with a nice smallish automaton), but DFA-to-regex is very complicated and tends to produce huge resulting regexes. Unfortunately it's the best avaliable general procedure for negating regexes. – hmakholm left over Monica Sep 09 '12 at 14:35
?is the usual meaning for?in "regular expressions", and the "any character" meaning is only commonly used in simple patterns that have no repetition constructs and so are not called "regular expressions". – hmakholm left over Monica Sep 09 '12 at 14:38