Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mencapai kefungsian rupa pembolehubah panjang di belakang pernyataan dalam ungkapan biasa tanpanya?

Bagaimanakah saya boleh mencapai kefungsian rupa pembolehubah panjang di belakang pernyataan dalam ungkapan biasa tanpanya?

DDD
DDDasal
2024-10-31 22:07:02144semak imbas

How can I achieve the functionality of variable-length lookbehind assertions in regular expressions without them?

Alternatif Pandangan Belakang-Penegasan Pembolehubah-Panjang untuk Ungkapan Biasa

Pandangan panjang pembolehubah di belakang penegasan, seperti /(?<!foo.*)bar/, benarkan anda untuk memadankan corak jika syarat tertentu dipenuhi untuk bilangan pembolehubah aksara yang mendahului corak. Walaupun beberapa pelaksanaan ungkapan biasa, seperti modul regex dalam Python, menyokong lihat di belakang pernyataan panjang berubah-ubah, terdapat alternatif yang boleh digunakan dalam pelaksanaan lain.

K: Killing Captured Characters

Satu alternatif kepada pemerhatian panjang berubah-ubah di belakang pernyataan ialah aksara K. K menandakan titik dalam ungkapan biasa di mana perlawanan berikutnya tidak boleh dianggap sebagai sebahagian daripada rentetan yang ditangkap terakhir. Contohnya, ungkapan biasa berikut:

s/unchanged-part\Kchanged-part/new-part/x

Akan memadankan subrentetan "bahagian berubah" dalam rentetan "bahagian yang tidak berubah" dan menggantikannya dengan "bahagian baharu". Walau bagaimanapun, bahagian "bahagian tidak berubah" rentetan tidak akan disertakan dalam penggantian.

Pandangan Negatif Di Belakang Sebagai Anggaran

Manakala K boleh digunakan untuk menganggarkan rupa panjang berubah-ubah di belakang pernyataan dalam padanan, ia tidak begitu fleksibel. Contohnya, tiada persamaan pandangan negatif di belakang penegasan menggunakan K.

Pandangan negatif di belakang penegasan sepadan dengan corak jika syarat tertentu tidak dipenuhi untuk bilangan pembolehubah aksara yang mendahului corak. Ungkapan biasa berikut menggunakan penegasan pandangan belakang negatif untuk memadankan rentetan "bar" hanya jika ia tidak didahului dengan "foo":

/(?<!foo.*)bar/

Penghampiran ungkapan ini tanpa menggunakan penegasan pandangan belakang panjang berubah boleh ditulis sebagai:

s/^(?:(?!foo).)*\Kbar/moo/s;

Pelaksanaan Ungkapan Biasa Dipertingkatkan

Walaupun pelaksanaan ungkapan biasa standard dalam Perl, Ruby, JavaScript dan PHP tidak menyokong rupa pembolehubah panjang di belakang pernyataan, terdapat tetapan biasa yang dipertingkatkan. pelaksanaan ungkapan tersedia untuk setiap bahasa ini:

  • Perl: Modul pcre menyediakan sokongan untuk penegasan lihat belakang panjang berubah-ubah.
  • Ruby: Permata rexml menyediakan sokongan untuk penegasan pandangan belakang panjang berubah-ubah.
  • JavaScript: Pustaka js-regex menyediakan sokongan untuk penegasan pandangan belakang panjang berubah-ubah.
  • PHP: Pustaka pcre menyediakan sokongan untuk penegasan lihat belakang panjang berubah-ubah.

Pelaksanaan ungkapan biasa yang dipertingkatkan ini menawarkan ciri dan pengoptimuman tambahan, termasuk sokongan untuk penegasan pandangan belakang panjang berubah.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mencapai kefungsian rupa pembolehubah panjang di belakang pernyataan dalam ungkapan biasa tanpanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn