Bagaimana cara kerjanya?
Lihatlah teori automata
Singkatnya, setiap ekspresi reguler memiliki otomat terbatas yang setara dan dapat dikompilasi dan dioptimalkan untuk otomat terbatas. Algoritma yang terlibat dapat ditemukan di banyak buku kompiler. Algoritma ini digunakan oleh program unix seperti awk dan grep.
Namun, sebagian besar bahasa pemrograman modern (Perl, Python, Ruby, Java (dan bahasa berbasis JVM), C #) tidak menggunakan pendekatan ini. Mereka menggunakan pendekatan backtracking rekursif, yang mengkompilasi ekspresi reguler menjadi pohon atau urutan konstruksi yang mewakili berbagai sub-bongkahan dari ekspresi reguler. Kebanyakan sintaks "ekspresi reguler" modern menawarkan referensi-ulang yang berada di luar kelompok bahasa reguler (mereka tidak memiliki representasi dalam automata terbatas), yang secara sepele dapat diterapkan dalam pendekatan backtracking rekursif.
Optimalisasi biasanya menghasilkan mesin keadaan yang lebih efisien. Sebagai contoh: pertimbangkan aaaab | aaaac | aaaad, seorang programmer normal bisa mendapatkan implementasi pencarian yang sederhana tetapi kurang efisien (membandingkan tiga string secara terpisah) tepat dalam sepuluh menit; tetapi menyadari itu setara dengan aaaa [bcd], pencarian yang lebih baik dapat dilakukan dengan mencari empat 'a' lalu menguji karakter ke-5 terhadap [b, c, d]. Proses optimasi adalah salah satu pekerjaan rumahan kompiler saya bertahun-tahun yang lalu, jadi saya berasumsi itu juga di kebanyakan mesin ekspresi reguler modern.
Di sisi lain, mesin negara memang memiliki beberapa keuntungan ketika mereka menerima string karena mereka menggunakan lebih banyak ruang dibandingkan dengan "implementasi sepele". Pertimbangkan program untuk melepaskan kutip dari string SQL, yaitu: 1) dimulai dan diakhiri dengan tanda kutip tunggal; 2) tanda kutip tunggal diloloskan oleh dua kutip tunggal berturut-turut. Jadi: input ['a' ''] harus menghasilkan output [a ']. Dengan mesin negara, tanda kutip tunggal berturut-turut ditangani oleh dua negara. Kedua status ini melayani tujuan mengingat histori input sehingga setiap karakter input diproses tepat hanya sekali, seperti yang diilustrasikan berikut:
...
S1->'->S2
S1->*->S1, output *, * can be any other character
S2->'->S1, output '
S2->*->END, end the current string
Jadi, menurut pendapat saya, ekspresi reguler mungkin lebih lambat dalam beberapa kasus sepele, tetapi biasanya lebih cepat daripada algoritma pencarian yang dibuat secara manual, mengingat fakta bahwa pengoptimalan tidak dapat dilakukan secara andal oleh manusia.
(Bahkan dalam kasus sepele seperti mencari string, mesin pintar dapat mengenali jalur tunggal di peta keadaan dan mengurangi bagian itu menjadi perbandingan string sederhana dan menghindari mengelola negara.)
Mesin tertentu dari kerangka / pustaka mungkin lambat karena mesin melakukan banyak hal lain yang biasanya tidak dibutuhkan oleh programmer. Contoh: kelas Regex di .NET membuat banyak objek termasuk Pertandingan, Grup dan Capture.