FWIW、正規言語(別名有理言語)は補完の下で閉じているため、別の式を否定する正規表現(別名有理式)を見つけることは常に可能です。しかし、多くのツールはこれを実装していません。
Vcsnはこの演算子をサポートします(これは{c}
、postfixを意味します)。
最初に、式のタイプを定義します。ラベルは、たとえば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が続く」、「彼の後に非dが続く」、「hedの後に非eが続く」です。これらのN-1ケースを何とか通過できた場合、成功しませんでした、不要な文字列に一致ため、[^h]*
もう一度