Menghitung perbedaan dan irisan dua ekspresi reguler
(phylactery.org)- Saat perlu membandingkan ekspresi reguler seperti himpunan string, antimirov dapat menghitung relasi inklusi dan kesetaraan antara dua ekspresi α dan β, serta irisan dan selisihnya dalam satu layar
- Area hasil menampilkan komplemen dan relasi sekaligus, sehingga Anda dapat memeriksa operasi seperti
~α,α < β,α = β,α & β,α ^ β,α - β - Jika memasukkan string terpisah
s, Anda bisa langsung memverifikasi apakah masing-masing ekspresi reguler cocok melaluis ∈ αdans ∈ β - Sintaksnya mendukung
., konkatenasi, pilihan|, pengulangan*·+·?·{n}·{m,n}, grup karakter, grup karakter negasi, escape, dan escape Unicode UTF-16 - Fitur pengubah perilaku seperti anchor, zero-width assertion, backreference, ekstraksi subgrup, pencarian/pencocokan parsial, dan pengabaian huruf besar-kecil tidak didukung
Perbandingan ekspresi reguler dan operasi himpunan
- Area input menerima dua ekspresi reguler α dan β
- Output menampilkan komplemen serta operasi relasi dan himpunan dari kedua ekspresi reguler sekaligus
~α,~β: komplemen dari masing-masing ekspresi regulerα < β,α = β,α > β: relasi inklusi dan kesetaraan antara dua ekspresi regulerα & β: irisanα ^ β: beda simetrisα - β: selisih
- Jika memasukkan string s, Anda dapat memeriksa apakah string tersebut termasuk ke masing-masing ekspresi reguler dalam bentuk
s ∈ α,s ∈ β - Ukuran tiap ekspresi reguler dan jumlah status DFA juga ditampilkan
- Pada layar contoh,
|α| = 1,|β| = 1 - Pada layar contoh,
dfa(α)dandfa(β)masing-masing memiliki 1 status
- Pada layar contoh,
Sintaks ekspresi reguler yang didukung
- Operator dasar mencakup karakter tunggal, konkatenasi, pilihan, dan pengulangan
.: mencocokkan satu karakter apa punxy: konkatenasi yang mencocokkanxlaluyx|y: mencocokkanxatauyx*: pengulangan 0 kali atau lebih(xyz): pengelompokan(): ekspresi reguler kosong yang mencocokkan string kosong
- Bentuk singkat pengulangan yang umum juga didukung
x+: pengulangan 1 kali atau lebih, setara denganxx*x?: pencocokan opsional, setara dengan(x|)x{n}: mengonkatenasikanxsebanyak n kalix{m,n}: mengonkatenasikanxminimal m kali dan maksimal n kali
- Himpunan karakter dan escape dapat menggunakan bentuk berikut
[a-z0-9]: mencocokkan satu karakter dalam grup[^a-z0-9]: mencocokkan satu karakter yang tidak ada dalam grup\\c: escape karakter khususc\\u001a: mencocokkan karakter UTF-16 yang sesuai- Selain itu, karakter seperti
a,b,cmencocokkan dirinya sendiri
Fitur yang tidak didukung
- antimirov berfokus pada penanganan ekspresi reguler sebagai objek operasi himpunan, sehingga fitur berikut dikecualikan
- Anchor
^,$- Namun,
^dan$tetap harus di-escape
- Namun,
- Zero-width assertion, misalnya
(?=...),(?<=...) - Backreference, misalnya
\\1,\\2 - Ekstraksi subgrup
- Pencarian atau pencocokan parsial
- Flag lain yang mengubah perilaku, seperti pengabaian huruf besar-kecil
- Anchor
- Informasi lebih lanjut dapat dilihat di non/antimirov
1 komentar
Komentar Hacker News
Saya pernah membuat demo web serupa yang menunjukkan proses regex berubah dari parsing → NFA → DFA → DFA minimal, lalu dari DFA minimal menghasilkan LLVM IR/Javascript/WebAssembly
http://compiler.org/reason-re-nfa/src/index.html
Sebagai referensi, turunan Brzozowski juga bisa menarik sebagai pendekatan alternatif untuk pencocokan regex: https://en.wikipedia.org/wiki/Brzozowski_derivative
Library ini bisa dipakai untuk membuat hierarki kelas string, sehingga string bertipe dapat dimanfaatkan lebih aktif
Misalnya, email dan URL memiliki tata bahasa khusus; ruang nilainya adalah subset dari semua string yang tidak kosong, dan string yang tidak kosong adalah subset dari semua string
Jika type system mengetahui bahwa string email adalah subtype dari string yang tidak kosong, maka alamat email yang diberikan ke fungsi yang membutuhkan string tidak kosong dapat dianggap valid
Library ini bisa digunakan untuk memverifikasi definisi dan hierarki tipe string semacam itu, sementara implementasi hierarkinya berbeda-beda di tiap bahasa, misalnya melalui subclassing, trait bound, dan sebagainya
Konstruktor
Addresstidak diekspor, hanya tipenya yang diekspor; validasi dilakukan di dalamfromString :: Text -> Maybe Address, dan jika alamat tidak valid akan mengembalikanNothingValiditas jangan dicampurkan ke dalam data; kirimkan sinyal lewat jalur terpisah, lalu saat perlu output, ambil kembali nilai yang dibungkus dengan
toText :: Address -> Texthttps://news.ycombinator.com/item?id=31092912
@pada pagi hari di akhir musim panasHeuristik sederhana bahwa setiap regex yang mencoba merepresentasikan “alamat email yang valid” pasti salah memang cukup aman, tetapi itu merusak semua keseruannya
Regex adalah contoh bagus dari teori matematika yang cukup keren dan kompleks yang dibungkus menjadi antarmuka yang bernilai
Aljabar linear juga terasa mirip
Bahkan transformasi Möbius pada bidang kompleks
w=(az+b)/(cz+d)pun bisa diubah menjadi aljabar linearAntarmuka yang baik punya nilai intrinsik, tetapi banyak orang yang berorientasi hasil tidak terlalu mengakuinya
Halaman keren ini menghitung relasi biner di antara pasangan regex dan menampilkan DFA sebagai graf
Ini benar-benar mendemonstrasikan operasi-operasi yang cukup tidak trivial pada regex dengan sangat mengesankan
Meski begitu, saya kira anchor
^dan$tidak akan bermasalahSaya mencoba menempelkan “regex filter numbers divisible by 3”, dan halamannya benar-benar macet: https://stackoverflow.com/q/10992279/41948
^(?:[0369]+|[147](?:[0369]*[147][0369]*[258])*(?:[0369]*[258]|[0369]*[147][0369]*[147])|[258](?:[0369]*[258][0369]*[147])*(?:[0369]*[147]|[0369]*[258][0369]*[258]))+$^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]\*[258])))+$Saya penasaran apakah ada ekspresi yang lebih pendek
Contohnya seperti
(ab+c+)+,(abc){100},a.*quick brown fox jumps over the lazy dogSaya ingin melihat irisan antara URL yang valid secara sintaksis dan alamat email, tetapi memasukkan regex URL di bawah ini saja membuat halaman butuh waktu terlalu lama untuk memprosesnya
[\-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([\-a-zA-Z0-9()@:%_+.~#?&//=]*)Sumber: https://stackoverflow.com/a/3809435/623763
(...){1,256}sangat berat, dan kode Scala JS pada akhirnya akan timeout atau membuat browser matiKalau itu diganti menjadi
(...)+, setidaknya di lingkungan saya bisa berjalan. Ekspresi kecil seperti(...){1,6}sepertinya baik-baik sajaSaya sempat terkejut karena regex yang dihasilkan dari gabungan dan irisan tidak terlalu ringkas, tetapi segera bisa memahaminya
Misalnya, irisan dari
"y.+"dan".+z"bisa ditulis dengan ekspresi yang sangat sederhana, yaitu"y.*z", dan kesetaraannya juga bisa dikonfirmasi lewat halaman tersebut. Namun alat ini menghasilkanyz([^z][^z]*z|z)*|y[^z](zz*[^z]|[^z])*zz*Pasti ada alasan mengapa hasil seperti ini muncul, tetapi kemungkinan menghasilkan regex minimal berdasarkan kriteria seperti jumlah karakter jauh lebih sulit
".+z"menjadi lebih besar dan berantakan setelah diubah menjadi automaton deterministikDulu saya pernah memakai konsep ini untuk menulis logika validasi pada pengaturan “IP RegEx filter”
Tujuannya adalah memungkinkan pengguna mengatur filter IP dengan regex. Tim marketing tidak memahami CIDR, tetapi mereka tahu regex karena Google Analytics
Bagaimana cara mendefinisikan regex yang valid? Irisannya dengan regex “semua alamat IPv4” tidak boleh kosong, dan pada saat yang sama juga tidak boleh sama dengan regex “semua alamat IPv4”
Ini banyak mencegah keluhan bahwa filter tidak melakukan apa-apa, tetapi tidak mencegah input filter yang keliru itu sendiri
Ini juga membantu menangani masalah filter yang keliru
Agar lebih nyaman dipakai di mobile, sebaiknya matikan saran otomatis pada field input regex
https://stackoverflow.com/questions/35513968/disable-autocor...
Saya menguji halaman dengan 2 regex untuk angka yang habis dibagi 3 yang serupa, dan meski
^serta$di kedua ujungnya dihapus, halaman tetap berhentiRegex 1:
([0369]|([258]|[147][0369]*[147])([0369]|([147][0369]*[258]|[258][0369]*[147]))*([147]|[258][0369]*[258])|([147]|[258][0369]*[258])([0369]|([147][0369]*[258]|[258][0369]*[147]))*([258]|[147][0369]*[147]))*Regex 2:
([0369]|[258][0369]*[147]|(([147]|[258][0369]*[258])([0369]|[147][0369]*[258])*([258]|[147][0369]*[147])))*Semuanya berhasil di-parse sampai tepat sebelum
*terakhir, tetapi begitu*ditambahkan, seluruh halaman berhentiTanpa
*, halaman menghasilkan validator yang valid untuk mem-parse potongan angka yang jumlah digitnya habis dibagi 3