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]*
再次查找