Baru-baru ini saya berdiskusi dengan seorang teman tentang sebuah situs web yang mengusulkan tantangan regex, terutama mencocokkan sekelompok kata dengan properti khusus. Dia sedang mencari regex yang cocok dengan string seperti di ||||||||
mana jumlah |
prima. Saya segera mengatakan kepadanya bahwa tidak akan pernah berhasil karena jika bahasa seperti itu biasa, terjemahan lemma pemompaan akan memberikan fakta bahwa untuk prime cukup besar, itu ada sehingga p + nk adalah prima untuk semua n \ geq -1 , dan ini sepertinya tidak akan terjadi sama sekali (partisi ulang bilangan prima, hal-hal sepele dari properti yang tidak diketahui dan dihancurkan, ...)
Tapi kemudian seseorang datang dengan solusi: TIDAK MATCHING (||+?)\1+
Ungkapan ini mencoba untuk mencocokkan kelompok capture (yang dapat ||
, |||
, ||||
dan sebagainya dari kejadian dari |
) kali. Jika cocok, itu berarti bahwa angka yang diwakili oleh string dapat dibagi oleh , dan karenanya tidak prima. Kalau tidak demikian.
Dan saya merasa bodoh, karena menjadi jelas bahwa pengelompokan dan backreference memungkinkan regex menjadi jauh lebih ekspresif daripada ... ekspresi reguler, dalam pengertian teoretis. Sekarang mereka bahkan menambahkan lookarounds dan operator lain yang saya tidak tahu ketika saya melakukan regex nyata.
Menurut Wikipedia, bahkan lebih ekspresif bahasa yang dihasilkan oleh tata bahasa bebas konteks. Jadi inilah pertanyaan saya:
- dapatkah kita mewakili bahasa aljabar apa pun (dihasilkan dari tata bahasa bebas konteks) dengan mesin ekspresi reguler modern
- adakah deskripsi yang lebih umum, atau setidaknya batas atas pada kompleksitas jenis bahasa apa yang dapat dijelaskan oleh regex modern?
Lebih pragmatis, apakah ada teori serius di baliknya atau kita hanya menambahkan fitur baru karena setiap kali tampaknya dapat diterapkan pada blok awal ekspresi reguler nyata berdasarkan automata terbatas?
Saya tahu bahwa "regex modern" tidak terlalu spesifik sementara pertanyaannya adalah, tapi maksud saya setidaknya dengan referensi, dan mungkin lebih. Tentu saja, jika Anda memiliki jawaban parsial dengan asumsi batasan tertentu pada bahasa "regex modern" ini, jangan ragu untuk mempostingnya.
sumber
Jawaban:
Kata problem of regular expressions dengan backreferences adalah NP-complete; mengutip Aho (1990) melalui Blaisorblade / Charles Stewart .
Saya tidak tahu seluruh rangkaian operator yang memiliki beberapa rasa regexps, tetapi beberapa tidak lebih kuat dari biasa ; mereka mungkin telah ditambahkan sebagai gula sintaksis.
sumber