Dapatkah regex yang mengandung quantifier nongreedy (enggan) ditulis ulang untuk tidak menggunakannya?

8

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 .[Sebuah0,Sebuah1)Rs=s0...snNsSebuah0...sSebuah1-1R

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:Sebuah=[Sebuah0,Sebuah1)Rb=[b0,b1)Sebuah0<b0Sebuah0=b0

  • 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.RR

  • Jika :R=ST

    • Bagian utama dari adalah kecocokan yang lebih baik untuk S daripada bagian terkemuka dari b , atauSebuahSb
    • 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 .SebuahbSSebuahTb
  • Jika :R=S|T

    • adalah kecocokan untuk S dan b tidak, atauSebuahSb
    • dan b adalah pertandingan sama baik untuk S dan sebuah merupakan pertandingan yang lebih baik untuk S dari b , atauSebuahbSSebuahSb
    • dan b tidak cocok untuk S tetapi pertandingan untuk T , dan sebuah merupakan pertandingan yang lebih baik untuk T dari b adalah.SebuahbSTSebuahTb

Semua bentuk sintaksis lainnya mengurangi ke tiga di atas untuk tujuan prioritas pertandingan:

  • : R S 0 | S 1 | ...R=SRS0|S1|...
  • : R | S 1 | S 0R=S?R...|S1|S0

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 .S,T ST

T: Apakah ini kasus bahwa untuk setiap regex mengandung quantifier nongreedy ? ada regex T yang setara dengan pertandingan yang tidak mengandung penjumlahan nongreedy?S?T

Sunting: Ini adalah penulisan ulang lengkap pertanyaan untuk memperjelas apa yang ditanyakan.

uckelman
sumber
1
Saya mencoba untuk memperbaiki LaTeX dalam pertanyaan, tetapi harap periksa apakah itu yang Anda maksud. ( \tttidak mencegah LaTeX menafsirkan karakter khusus dan mengontrol urutan!)
Tsuyoshi Ito
2
Anda harus berhati-hati apa yang Anda maksud dengan "kekuatan ekspresif" dari ekspresi reguler. Jika Anda hanya mempertimbangkan bahasa mana yang dikenal oleh ekspresi reguler, maka itu sepele bahwa quantifier enggan tidak menambahkan kekuatan tambahan karena mereka tidak mengubah bahasa yang dikenal oleh ekspresi reguler. Tapi saya pikir Anda berpikir tentang sifat ekspresi reguler yang lebih baik seperti substring yang ditangkap dan sebagainya.
Tsuyoshi Ito
1
Tidak, L ( a+?) masih {a ^ n: n≥1}. Jika Anda melakukan pertandingan regex yang tidak dikurung (seperti 'aaaa' =~ /a+?/di Perl), Anda tidak akan mendapatkan aaaahasilnya, tetapi itu hanya karena cabang dicoba dengan urutan yang berbeda a+. Jika Anda melakukannya dengan tepat dengan jangkar (seperti 'aaaa' =~ /^a+?\z/di Perl), Anda mendapatkan aaaahasilnya.
Tsuyoshi Ito
1
(1) Saya senang melihat bahwa komentar dan jawaban saya bermanfaat bagi Anda untuk menyatakan kembali pertanyaan dengan lebih baik (meskipun Anda belum mengakuinya). (2) Saya harap Anda sadar bahwa “set pertandingan yang tidak tumpang tindih yang dimiliki S dan T pada t” tidak terdefinisi dengan baik karena mungkin ada beberapa set pertandingan yang tidak tumpang tindih. Apakah Anda berbicara tentang daftar yang cocok dengan regex global ( //gdalam Perl) akan kembali?
Tsuyoshi Ito
2
Pertanyaan Anda perlu diselesaikan; Anda masih berbicara tentang "menerima" kecocokan ketika serakah vs tidak serakah tidak mengubah apa yang diterima; itu hanya sarana untuk menentukan kecocokan mana yang harus dicari ketika mencari kecocokan dan menemukan banyak kecocokan.
Eamon Nerbonne

Jawaban:

3

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 string aaaa, dan mengingat substring yang cocok dengan variabel khusus. Bahkan jika ada lebih dari satu substring aaaayang 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.

Tsuyoshi Ito
sumber
Tidak, saya tidak berbicara tentang rangkaian pertandingan yang akan didapatkan oleh pola yang tidak disimpan pada string yang diberikan. Saya berbicara tentang serangkaian string yang pola tertentu akan cocok dengan string secara keseluruhan. Dengan kata lain, saya tertarik untuk menulis ulang pola untuk mempertahankan kesetaraan di atas serangkaian string yang cocok pertama adalah seluruh string . a+dan a+?tidak setara dalam pengertian ini: aaaabukan pasangan yang cocok.
uckelman
1
@uckelman: Menurut definisi Anda, string abbbtidak dalam L ( a*(..)*) karena kecocokan pertama dalam string abbbke regex a*(..)*adalah abb. Itu bukan definisi standar bahasa yang dikenali oleh ekspresi reguler. Jika itu yang benar-benar Anda minati, Anda harus menyebutkannya secara berbeda.
Tsuyoshi Ito
uckelman, saya cukup yakin a+?cocok aaaa. Saya tahu Ruby lakukan.
Raphael
@ Raphael: Saya kira Anda berbicara tentang "aaaa" =~ /a?/mengembalikan true di Ruby, tapi itu karena polanya cocok dengan substring aaaa , bukan karena cocok aaaa.
Tsuyoshi Ito
Saya melewatkan +(diedit), dan Ruby sepertinya cocok dengan seluruh kata (cf rubular.com).
Raphael