FWIW,由于正则语言(又称有理语言)是在补语的基础上关闭的,因此总是有可能找到否定另一个表达式的正则表达式(即有理表达式)。但是没有多少工具可以实现这一点。
Vcsn支持此运算符(它表示{c}后缀)。
标签信(:你先定义表达式的类型lal_char)来接从a到z(与互补工作时定义的字母,当然是非常重要的),例如,与“价值”计算每个字仅仅是一个布尔:true这个词被接受,false,被拒绝。
在Python中:
In [5]: import vcsn
        c = vcsn.context('lal_char(a-z), b')
        c
Out[5]: {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} → 𝔹
然后输入表达式:
In [6]: e = c.expression('(hede){c}'); e
Out[6]: (hede)^c
将此表达式转换为自动机:
In [7]: a = e.automaton(); a

最后,将此自动机转换回简单表达式。
In [8]: print(a.expression())
        \e+h(\e+e(\e+d))+([^h]+h([^e]+e([^d]+d([^e]+e[^]))))[^]*
其中+通常被表示|,\e表示空字,并且[^]通常被写成.(任何字符)。所以,用一点重写()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*。
你可以看到这个例子在这里,并尝试VCSN网上出现。
               
              
([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*?这个想法很简单。保持匹配,直到看到不需要的字符串的开头,然后仅在N-1个未完成的字符串(其中N是字符串的长度)的情况下匹配。这N-1个情况是“ h跟非e”,“ he跟非d”和“ hed跟非e”。如果您成功通过了这N-1个案例,则说明您成功地将不需要的字符串与不匹配,因此您可以[^h]*再次查找