Masalah
Tidak ada cara mudah untuk mendapatkan permutasi dengan regex.
- Permutasi: Mendapatkan kata ("aabc") ke urutan lain, tanpa mengubah jumlah atau jenis huruf.
- Regex: Ekspresi reguler.
Untuk verifikasi:
- "Regex permutasi tanpa pengulangan" Jawabannya menciptakan kode JavaScript, bukan regex, dengan asumsi ini akan lebih sederhana.
- "Bagaimana menemukan semua permutasi dari kata yang diberikan dalam teks yang diberikan" - Jawabannya tidak menggunakan regex juga.
- "Regex untuk mencocokkan semua {1, 2, 3, 4} tanpa pengulangan" - Jawabannya menggunakan regex, tetapi itu tidak mudah beradaptasi atau sederhana.
- Jawaban ini bahkan mengklaim: "Ekspresi reguler tidak dapat melakukan apa yang Anda minta. Itu tidak dapat menghasilkan permutasi dari string" .
Jenis solusi yang saya cari
Seharusnya berupa:
- »Aabc« (atau apa pun yang Anda bisa menggunakan kurung buka dan tutup)
- (aabc)! (mirip dengan (abc)? tetapi dengan simbol lain pada akhirnya)
- [aabc]! (mirip dengan [abc] + tetapi dengan simbol lain pada akhirnya)
Keuntungan dari solusi ini
Mereka:
- mudah
- mudah beradaptasi
- dapat digunakan kembali
Kenapa ini harus ada
- Regex adalah cara untuk menggambarkan tata bahasa dari bahasa reguler. Mereka memiliki kekuatan penuh untuk menjadi jenis bahasa biasa.
- Katakanlah, bahasa reguler cukup kuat untuk permutasi (bukti di bawah) - mengapa tidak ada cara mudah untuk mengekspresikan ini?
Jadi pertanyaan saya adalah:
- (Kenapa) Apakah buktiku salah?
- Jika benar: Mengapa tidak ada cara mudah untuk mengekspresikan permutasi?
Bukti
- Ekspresi reguler adalah salah satu cara untuk memperhatikan tata bahasa bahasa reguler. Mereka dapat menjelaskan tata bahasa bahasa biasa.
- Cara lain untuk menggambarkan bahasa biasa (yang memiliki jumlah huruf hingga dalam alfabet) terbatas adalah tata bahasa yang bukan deterministik (dengan jumlah negara terbatas).
Memiliki jumlah huruf yang terbatas saya dapat membuat otomat ini: (Contoh. Formal: lihat di bawah)
Tata bahasa yang menerima permutasi "abbc":
(coba nomor di atas, mungkin seseorang tahu cara membuat bagian ini terlihat lebih baik)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (tidak ada kesalahan ketik!)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Lebih formal: (menggunakan finite-state-automaton tetapi ini bisa dibuat dengan tata bahasa juga)
- Sebuah kata q (dengan panjang terbatas) yang permutasi apa pun harus mencapai kondisi penerimaan.
- X adalah alfabet terbatas.
- Set of state S berisi urutan huruf apa saja hingga panjang q. (Jadi ukuran S adalah terbatas.) Ditambah satu status "any any word".
- status transisi fungsi d yang mengambil huruf dan bergerak pada status yang sesuai dengan bagian kata yang sekarang dibaca.
- F adalah himpunan yang menyatakan permutasi yang tepat dari q.
Jadi dimungkinkan untuk membuat otomat kondisi-terbatas untuk menerima permutasi dari kata yang diberikan.
Pindah dengan buktinya
Jadi saya telah membuktikan bahwa bahasa reguler memiliki kekuatan untuk memeriksa permutasi, bukan?
Jadi mengapa tidak ada pendekatan untuk mencapai ini dengan Regex? Ini fungsionalitas yang berguna.
^(a()|a()|b()|c()){4}\2\3\4\5$
tampaknya berfungsi (lihat regex101.com/r/9URPpg/4/tests ).Jawaban:
Teorema dasar teori bahasa formal adalah bahwa ekspresi reguler, tata bahasa reguler, deterministic finite automata (DFAs) dan finite automata (NFA) deterministik semuanya menggambarkan jenis bahasa yang sama: yaitu bahasa reguler. Fakta bahwa kita dapat mendeskripsikan bahasa-bahasa ini dalam banyak cara yang sangat berbeda menunjukkan bahwa ada sesuatu yang alami dan penting tentang bahasa-bahasa ini, dengan cara yang sama seperti kesetaraan mesin Turing, kalkulus lambda dan segala macam hal lainnya menunjukkan bahwa bahasa yang dapat dihitung alami dan penting. Itu bukan hanya artefak dari keputusan acak apa pun yang dibuat oleh penemu asli.
Misalkan kita menambahkan aturan baru untuk menciptakan ekspresi reguler: jikaR adalah ekspresi reguler, maka π(R) adalah ekspresi reguler, dan itu cocok dengan setiap permutasi dari setiap string yang cocok dengan R . Jadi, misalnya, L(π(abc))={abc,acb,bac,bca,cab,cba} . Masalahnya adalah ini melanggar kesetaraan mendasar yang dijelaskan di atas. L(π((ab)∗))) adalah bahasa string yang berisi jumlah yang sama a s dan b dan ini bukan bahasa biasa. Bandingkan ini dengan, misalnya, menambahkan operator negasi atau pembalikan ke ekspresi reguler, yang tidak mengubah kelas bahasa yang diterima.
Jadi, untuk menjawab pertanyaan judul, ekspresi reguler tidak dapat melakukan permutasi dan kami tidak menambahkan kemampuan itu karena kemudian ekspresi reguler tidak akan cocok dengan bahasa biasa. Karena itu, ada kemungkinan bahwa "ekspresi reguler dengan permutasi" juga akan menjadi kelas bahasa yang menarik dengan banyak penokohan yang berbeda.
sumber
!
operator dalam praktik, dan saya kira beberapa orang memiliki, karena mudah diimplementasikan, dan tidak ada implementasi dari ekspresi reguler yang diperluas. telah terlihat mendukungnya."Bukti" Anda hanya melihat permutasi kata tunggal, yang merupakan bahasa terbatas.
Setiap bahasa berhingga adalah reguler (mis. Hanya dengan mendaftar semua anggota dengan
|
inbetween), tetapi ada bahasa reguler yang tak terbatas (dan itu pada umumnya yang lebih menarik).Segera setelah Anda mendapatkan ekspresi reguler (atau tata bahasa / otomat) yang menerima bahasa tak terbatas (yaitu ekspresi dengan
*
operator, atau automaton dengan loop), konstruksi Anda tidak berfungsi lagi (Anda mendapatkan tata bahasa / otomat tak terbatas) ).Jawaban oleh David Richerby memberikan contoh bahasa biasa yang bahasa permutasinya tidak teratur lagi - semua contoh tersebut adalah bahasa tanpa batas.
sumber
Jadi dalam beberapa hal, tidak ada cara ringkas untuk menentukan semua permutasi kata.
sumber
Mengapa tidak ada cara untuk menulis "permutasi" di Regex
Permutasi bahasa reguler dan tak terbatas (jumlah kata tak terbatas) belum tentu teratur. Dengan demikian, tidak dapat ditulis sebagai regex.
Bukti
Pikirkan bahasanya
(ab)*
. (Contoh terinspirasi oleh David Richerby .) Salah satu permutasi adalaha*b*
. Ini bukan bahasa biasa. qed.sumber