欧美AV无码一区二区,麻豆+无码+国产在线+观看,欧美狂躁少妇XXXX高潮无码,美女扒开屁股让男人桶免费观看,极品粉嫩国产18尤物在线播放

一次性子組

對于同時(shí)有最大值和最小值量詞限制的重復項, 在匹配失敗后, 緊接著(zhù)會(huì )以另外一個(gè)重復次數重新評估是否能使模式匹配。 當模式的作者明確知道執行上沒(méi)有問(wèn)題時(shí), 通過(guò)改變匹配的行為或者使其更早的匹配失敗以阻止這種行為是很有用的。

考慮一個(gè)例子,模式 \d+foo 應用到目標行 123456bar 時(shí):

在匹配了 6 個(gè)數字后匹配 ”foo” 時(shí)失敗,通常的行為時(shí)匹配器嘗試使 \d+ 只匹配 5 個(gè)數字, 只匹配 4 個(gè)數字,在最終失敗之前依次進(jìn)行嘗試。 一次性子組提供了一種特殊的意義, 當模式的一部分得到匹配后,不再對其進(jìn)行重新評估, 因此匹配器在第一次匹配 ”foo” 失敗后就能立刻失敗。語(yǔ)法符號是另外一種特殊的括號, 以 (?> 開(kāi)始,比如 (?>\d+)bar

這種括號對模式的一部分提供了”鎖定”,當它包含一個(gè)匹配之后, 會(huì )阻止未來(lái)模式失敗后對它內部的后向回溯。后向回溯在這里失效, 其他工作照常進(jìn)行。

換一種說(shuō)法,如果在目標字符串中當前匹配點(diǎn)是錨點(diǎn), 這種類(lèi)型的子組匹配的字符串等同于一個(gè)獨立的模式匹配。

一次性子組不是捕獲子組。如上面的例子,簡(jiǎn)單而言, 就是盡其所能吃掉盡可能多的匹配字符。因此, 盡管 \d+ 和 \d+? 都會(huì )調整要匹配的數字的個(gè)數以便模式的其他部分匹配, (?>\d+) 卻僅能匹配整個(gè)數字序列。

這個(gè)(語(yǔ)法)結構可以包含任意復雜度的字符, 也可以嵌套。

一次性子組可以和后瞻斷言結合使用來(lái)指定在目標字符串末尾的有效匹配。 考慮當一個(gè)簡(jiǎn)單的模式比如 abcd$ 應用到一個(gè)不匹配的長(cháng)字符串上。 由于匹配時(shí)從左到右處理的, PCRE會(huì )從目標中查找每一個(gè) ”a” 然后查看是否緊接著(zhù)會(huì )匹配模式的剩余部分。 如果模式是 ^.*abcd$ , 那么初始的 .* 將首先匹配整個(gè)字符串,但是當它失敗后(因為緊接著(zhù)不是 ”a”), 它會(huì )回溯所有的匹配,依次吐出最后 1 個(gè)字符,倒數第 2 個(gè)字符等等。 從右向左查找整個(gè)字符串中的 ”a”, 因此,我們不能很好的退出。然而, 如果模式寫(xiě)作 ^(?>.*)(?<=abcd) 那么它就不會(huì )回溯 .* 這一部分, 它僅僅用于匹配整個(gè)字符串。后瞻斷言對字符串末尾的后四個(gè)字符做了一個(gè)測試。 如果它失敗,匹配立即失敗。對于長(cháng)字符串, 這個(gè)模式將會(huì )帶來(lái)顯著(zhù)的處理時(shí)間上的性能提升。

當一個(gè)模式中包含一個(gè)子組自己可以無(wú)限重復并且內部有無(wú)限重復元素時(shí), 使用一次性子組是避免一些失敗匹配消耗大量時(shí)間的唯一途徑。 模式 (\D+|<\d+>)*[!?] 匹配一個(gè)不限制數目的非數字字符或由 <> 閉合的數字字符緊跟著(zhù) ! 或 ?。 當它匹配的時(shí)候,運行時(shí)快速的。然而, 如果它應用到 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 上將會(huì )在報告錯誤之前消耗很多時(shí)間。 這是因為字符串可以用于兩種重復規則,并且需要為兩種重復規則都分配進(jìn)行嘗試。 (示例的結尾使用 [!?] 而不是單個(gè)的字符, 是因為 PCRE 和 perl 都會(huì )對模式最后是一個(gè)單獨字符時(shí)的快速報錯有優(yōu)化。 它們會(huì )記錄最后需要匹配的單個(gè)字符,當它們沒(méi)有出現在字符串中時(shí)快速報錯。) 如果模式修改為 ((?>\D+)|<\d+>)*[!?] 就會(huì )快速得到報錯。(譯注: 對于這里給出的模式,當目標字符串更長(cháng)的時(shí)候,消耗時(shí)間會(huì )迅速增加,慎用。)

欧美AV无码一区二区,麻豆+无码+国产在线+观看,欧美狂躁少妇XXXX高潮无码,美女扒开屁股让男人桶免费观看,极品粉嫩国产18尤物在线播放