Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial php 一个正则贪婪和非贪婪的疑问

一个正则贪婪和非贪婪的疑问

Jun 06, 2016 pm 08:35 PM
php ungkapan biasa corak tamak

<code&gt;    $exp = '/\d+?\_\d+?/';
    $str = "我的电话是123_45678";

    preg_match($exp, $str, $match);

    echo ($match[0]); // '123_4' 
</code&gt;
Salin selepas log masuk
Salin selepas log masuk

查资料说+号后面加一个问号,即(+?) 就是取消默认的贪婪模式匹配。 那按照我上面的正则,预想应该是输出1_4呀。 为什么第一组\d+? 匹配的不对,而第二组\d+?就匹配到一个4. 不明白了?

回复内容:

<code&gt;    $exp = '/\d+?\_\d+?/';
    $str = "我的电话是123_45678";

    preg_match($exp, $str, $match);

    echo ($match[0]); // '123_4' 
</code&gt;
Salin selepas log masuk
Salin selepas log masuk

查资料说+号后面加一个问号,即(+?) 就是取消默认的贪婪模式匹配。 那按照我上面的正则,预想应该是输出1_4呀。 为什么第一组\d+? 匹配的不对,而第二组\d+?就匹配到一个4. 不明白了?

正则表达式的机制是有限状态自动机。它会从一个字符串的第一个字符开始匹配正则。

那么,\d+?_\d+?这个正则,首先会从字符串的第一个字符(即'''我'''开始匹配),发现不符合条件,就接着往下匹配,直到匹配到了1这个字符,发现符合\d+?的条件,存起来,继续匹配,匹配到_这个字符,发现已经符合了\d+?_的所有条件,就继续往下又匹配到了4,因为是非贪婪的模式,所以到4就结束了,如果是贪婪,那么会匹配到最后的8。

在上述过程中,最开始的\d+?是从1开始匹配并记录的,因为有后面_的关系,所以它会把123都匹配上,只有这样才能满足正则表达式。这个时候非贪婪就不起作用了。

关于非贪婪,下面这个例子可能会帮你更好地理解它。

有这样一个字符串<div&gt;1</div&gt;,如果采用的模式去匹配,就会匹配到<div&gt;和<code&gt;

,用贪婪模式的话,会匹配到整个字符串。
这样的差别是因为,在(.*)是非贪婪时,正则找到第一个&gt;就停下了,完成了匹配。而在贪婪时,正则要找到符合条件的最后一个&gt;,才会停止匹配。当然这个也和(.*)是有关系的。如果换成\w+,这样的话,贪不贪婪也就没有影响了。
我可能也说得不是很清楚,楼主可以再体会一下。

<code&gt;'/\d+?\_\d+?/'
</code&gt;
Salin selepas log masuk

尽可能少的一串数字(至少1个),后面跟着一个_,再后面跟着 尽可能少的一串数字(至少1个)

体会一下这个整体, 和中间的连接词。。。

或者换句话说, 正则表达式匹配的是连续的字符序列, 拆开算什么鬼。。。

贪婪非贪婪(惰性) 两者的前提都是需要匹配成功,区别在于:

贪婪 是在匹配成功的前提下,尽可能多的去匹配
非贪婪(惰性)是在匹配成功的前提下,尽可能少的去匹配

同时,正则表达式还有另外一条规则,比贪婪非贪婪(惰性)规则的优先级更高

最先开始的匹配拥有最高的优先权——The match that begins earliest wins

根据以上原则,回归到楼主的正则表达式里:
第一个 \d+? 因为它后面有一个 _,它会匹配字符串里的 123_(优先级高) 而不是 3_,也不是楼主说的 1_(匹配不成功);
第二个 \d+? 会匹配到 4(尽可能少匹配) 而不是45678

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

Tag artikel 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

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian

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

Tarikh dan Masa CakePHP

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Konfigurasi Projek CakePHP

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

Muat naik Fail CakePHP

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Penghalaan CakePHP

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

Bincangkan CakePHP

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

Panduan Ringkas CakePHP

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

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP

See all articles