FWIW เนื่องจากภาษาปกติ (ภาษาอาคาที่มีเหตุผล) ปิดภายใต้การใช้งานร่วมกันจึงเป็นไปได้ที่จะหานิพจน์ทั่วไป แต่มีเครื่องมือไม่มากที่ใช้สิ่งนี้
Vcsnรองรับผู้ประกอบการนี้ (ซึ่งหมายถึง{c}
postfix)
แรกที่คุณกำหนดประเภทของการแสดงออกของคุณ: ป้ายชื่อเป็นตัวอักษร ( lal_char
) เพื่อเลือกจากa
ไปz
เช่น (การกำหนดตัวอักษรเมื่อทำงานกับ complementation เป็นของหลักสูตรที่สำคัญมาก) และ "มูลค่า" คำนวณสำหรับแต่ละคำเป็นเพียงบูลีน : 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 ตามด้วย non-e", "เขาตามด้วย non-d" และ "hed ตามด้วย non-e" หากคุณจัดการเพื่อผ่านกรณี N-1 เหล่านี้คุณไม่ประสบความสำเร็จในการจับคู่สตริงที่ไม่พึงประสงค์เพื่อให้คุณสามารถเริ่มต้นค้นหา[^h]*
อีกครั้ง