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 ).