FWIW는 정규 언어 (일명 합리적 언어)가 보완 아래 닫히므로 항상 다른 표현을 무효화하는 정규식 (일명 합리적인 표현)을 찾을 수 있습니다. 그러나이를 구현하는 도구는 많지 않습니다.
Vcsn 은이 연산자 ( {c}
후위를 나타냄 )를 지원합니다.
먼저 표현의 유형을 정의 라벨은 편지 ( lal_char
) 선택하는 제품들 a
에 대한 z
예를 들어 (알파벳을 정의 보완 작업을 할 때, 물론 매우 중요합니다), 각 단어에 대해 계산 된 "값이"단지 부울입니다 : true
단어가 수락 false
되고 거부됩니다.
파이썬에서 :
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 다음에 non-e", "he 다음에 non-d"및 "hed 뒤에 non-e"입니다. 이러한 N-1 케이스를 전달하는 관리하는 경우, 당신은 성공적으로 하지 않았다 당신이 찾고 시작할 수 있도록 원치 않는 문자열과 일치[^h]*
다시