Rumah pembangunan bahagian belakang tutorial php php—PCRE正则表达式一次性子组

php—PCRE正则表达式一次性子组

Nov 21, 2016 pm 05:13 PM
php

对于同时有最大值和最小值量词限制的重复项, 在匹配失败后, 紧接着会以另外一个重复次数重新评估是否能使模式匹配。 当模式的作者明确知道执行上没有问题时, 通过改变匹配的行为或者使其更早的匹配失败以阻止这种行为是很有用的。

考虑一个例子,模式 \d+foo 应用到目标行 123456bar 时:

在匹配了 6 个数字后匹配 ”foo” 时失败,通常的行为时匹配器尝试使 \d+ 只匹配 5 个数字, 只匹配 4 个数字,在最终失败之前依次进行尝试。 一次性子组提供了一种特殊的意义, 当模式的一部分得到匹配后,不再对其进行重新评估, 因此匹配器在第一次匹配 ”foo” 失败后就能立刻失败。语法符号是另外一种特殊的括号, 以 (?> 开始,比如(?>\d+)bar。

这种括号对模式的一部分提供了”锁定”,当它包含一个匹配之后, 会阻止未来模式失败后对它内部的后向回溯。后向回溯在这里失效, 其他工作照常进行。

换一种说法,如果在目标字符串中当前匹配点是锚点, 这种类型的子组匹配的字符串等同于一个独立的模式匹配。

一次性子组不是捕获子组。如上面的例子,简单而言, 就是尽其所能吃掉尽可能多的匹配字符。因此, 尽管 \d+ 和 \d+? 都会调整要匹配的数字的个数以便模式的其他部分匹配, (?>\d+) 却仅能匹配整个数字序列。

这个(语法)结构可以包含任意复杂度的字符, 也可以嵌套。

一次性子组可以和后瞻断言结合使用来指定在目标字符串末尾的有效匹配。 考虑当一个简单的模式比如abcd$应用到一个不匹配的长字符串上。 由于匹配时从左到右处理的,PCRE会从目标中查找每一个 ”a” 然后查看是否紧接着会匹配模式的剩余部分。 如果模式是^.*abcd$, 那么初始的 .* 将首先匹配整个字符串,但是当它失败后(因为紧接着不是 ”a”), 它会回溯所有的匹配,依次吐出最后 1 个字符,倒数第 2 个字符等等。 从右向左查找整个字符串中的 ”a”, 因此,我们不能很好的退出。然而, 如果模式写作 ^(?>.*)(?<=abcd) 那么它就不会回溯 .* 这一部分, 它仅仅用于匹配整个字符串。后瞻断言对字符串末尾的后四个字符做了一个测试。 如果它失败,匹配立即失败。对于长字符串, 这个模式将会带来显著的处理时间上的性能提升。

当一个模式中包含一个子组自己可以无限重复并且内部有无限重复元素时, 使用一次性子组是避免一些失败匹配消耗大量时间的唯一途径。 模式 (\D+|<\d+>)*[!?] 匹配一个不限制数目的非数字字符或由 <> 闭合的数字字符紧跟着 ! 或 ?。 当它匹配的时候,运行时快速的。然而, 如果它应用到 ”aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa” 上将会在报告错误之前消耗很多时间。 这是因为字符串可以用于两种重复规则,并且需要为两种重复规则都分配进行尝试。 (示例的结尾使用 [!?] 而不是单个的字符, 是因为 PCRE 和 perl 都会对模式最后是一个单独字符时的快速报错有优化。 它们会记录最后需要匹配的单个字符,当它们没有出现在字符串中时快速报错。) 如果模式修改为 ((?>\D+)|<\d+>)*[!?] 就会快速得到报错。(译注: 对于这里给出的模式,当目标字符串更长的时候,消耗时间会迅速增加,慎用。)


Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Pembalakan CakePHP Pembalakan CakePHP Sep 10, 2024 pm 05:26 PM

Log masuk CakePHP adalah tugas yang sangat mudah. Anda hanya perlu menggunakan satu fungsi. Anda boleh log ralat, pengecualian, aktiviti pengguna, tindakan yang diambil oleh pengguna, untuk sebarang proses latar belakang seperti cronjob. Mengelog data dalam CakePHP adalah mudah. Fungsi log() disediakan

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Panduan Ringkas CakePHP Panduan Ringkas CakePHP Sep 10, 2024 pm 05:27 PM

CakePHP ialah rangka kerja MVC sumber terbuka. Ia menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP mempunyai beberapa perpustakaan untuk mengurangkan beban tugas yang paling biasa.

See all articles