Pertimbangkan bahasa regex dengan quantifier greedy , quantifier nongreedy, pergantian kelas, dan kelas karakter. (Ini pada dasarnya adalah sebuah subbahasa dari PCRE tanpa referensi balik, pernyataan sekilas, atau beberapa bit lain yang lebih menarik.)
Sebuah pertandingan untuk untuk regex pada tali adalah interval setengah terbuka lebih sehingga diterima oleh .
Kami memberikan definisi rekursif dari apa yang membuat satu pertandingan lebih baik daripada yang lain. Sebuah pertandingan untuk regex R pada string adalah lebih baik daripada pertandingan lain b = [ b 0 , b 1 ) jika suatu 0 < b 0 atau, jika sebuah 0 = b 0 dan:
Jika adalah kelas karakter: Kelas karakter memiliki kecocokan unik, sehingga semua kecocokan pada posisi yang sama untuk R adalah sama. Karenanya kasus ini tidak mungkin.
Jika :
- Bagian utama dari adalah kecocokan yang lebih baik untuk S daripada bagian terkemuka dari b , atau
- Bagian terdepan dari dan b adalah kecocokan yang sama baiknya untuk S , dan bagian tambahan dari a adalah kecocokan yang lebih baik untuk T daripada bagian akhir dari b .
Jika :
- adalah kecocokan untuk S dan b tidak, atau
- dan b adalah pertandingan sama baik untuk S dan sebuah merupakan pertandingan yang lebih baik untuk S dari b , atau
- dan b tidak cocok untuk S tetapi pertandingan untuk T , dan sebuah merupakan pertandingan yang lebih baik untuk T dari b adalah.
Semua bentuk sintaksis lainnya mengurangi ke tiga di atas untuk tujuan prioritas pertandingan:
- : R ≡ S 0 | S 1 | ...
- : R ≡ … | S 1 | S 0
Pola tak terhingga ini digunakan hanya untuk tujuan prioritas pertandingan --- mereka bukan bagian dari bahasa pertandingan yang sedang dipertimbangkan.
Relasi "yang lebih baik" adalah urutan linier yang lemah pada semua kecocokan yang memungkinkan untuk suatu pola tertentu.
Sebut dua regexes pertandingan-setara jika, untuk setiap string input yang terbatas, set berpasangan menguraikan pertandingan terbaik untuk S sama dengan set berpasangan menguraikan pertandingan terbaik untuk T .
T: Apakah ini kasus bahwa untuk setiap regex mengandung quantifier nongreedy ∗ ? ada regex T yang setara dengan pertandingan yang tidak mengandung penjumlahan nongreedy?
Sunting: Ini adalah penulisan ulang lengkap pertanyaan untuk memperjelas apa yang ditanyakan.
sumber
\tt
tidak mencegah LaTeX menafsirkan karakter khusus dan mengontrol urutan!)a+?
) masih {a ^ n: n≥1}. Jika Anda melakukan pertandingan regex yang tidak dikurung (seperti'aaaa' =~ /a+?/
di Perl), Anda tidak akan mendapatkanaaaa
hasilnya, tetapi itu hanya karena cabang dicoba dengan urutan yang berbedaa+
. Jika Anda melakukannya dengan tepat dengan jangkar (seperti'aaaa' =~ /^a+?\z/
di Perl), Anda mendapatkanaaaa
hasilnya.//g
dalam Perl) akan kembali?Jawaban:
Jawaban ini didasarkan pada asumsi bahwa kesetaraan dua regex didefinisikan karena mereka mengenali bahasa yang sama. Itu tidak menjawab pertanyaan saat ini.
Anda memiliki kesalahpahaman umum bahwa quantifier yang enggan mengubah rangkaian string yang cocok dengan ekspresi reguler. Tidak, dan hanya mengubah opsi mana yang dicoba terlebih dahulu.
Misalnya, jika Anda melakukan kecocokan regex
'aaaa' =~ /a+/
di Perl, ia menemukan kecocokan pertama dalam stringaaaa
, dan mengingat substring yang cocok dengan variabel khusus. Bahkan jika ada lebih dari satu substringaaaa
yang cocok dengan regex yang diberikan, pertandingan selain dari pertandingan pertama diabaikan.Apakah bilangan bulat serakah atau enggan mempengaruhi pertandingan pertama di antara banyak pertandingan, tetapi rangkaian pertandingan tidak berubah. Dalam hal ini, rangkaian string yang cocok dengan regex tidak berubah, tidak peduli apakah Anda menggunakan quantifier serakah biasa atau quantifier enggan.
sumber
a+
dana+?
tidak setara dalam pengertian ini:aaaa
bukan pasangan yang cocok.abbb
tidak dalam L (a*(..)*
) karena kecocokan pertama dalam stringabbb
ke regexa*(..)*
adalahabb
. Itu bukan definisi standar bahasa yang dikenali oleh ekspresi reguler. Jika itu yang benar-benar Anda minati, Anda harus menyebutkannya secara berbeda.a+?
cocokaaaa
. Saya tahu Ruby lakukan."aaaa" =~ /a?/
mengembalikan true di Ruby, tapi itu karena polanya cocok dengan substringaaaa
, bukan karena cocokaaaa
.+
(diedit), dan Ruby sepertinya cocok dengan seluruh kata (cf rubular.com).