程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL內存表的特征與應用引見

MySQL內存表的特征與應用引見

編輯:MySQL綜合教程

MySQL內存表的特征與應用引見。本站提示廣大學習愛好者:(MySQL內存表的特征與應用引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL內存表的特征與應用引見正文


先來看下成績。

字符串

$str = '<script>123456</script>';

正則表達式為

$strRegex1 = '%<script>.+<\/script>%';
$strRegex2 = '%<script>.+?<\/script>%';
$strRegex3 = '%<script>(?:(?!<\/script>).)+<\/script>%';

這三個正則,分離會形成幾回回溯呢??
謎底:

$strRegex1 = '%<script>.+<\/script>%'; //9次,記得差別本義符號。
$strRegex2 = '%<script>.+?<\/script>%'; //5次
$strRegex3 = '%<script>(?:(?!<\/script>).)+<\/script>%'; //7次

關於第一種貪心婚配的婚配規矩,回溯的9次是正則【】對字符串“”婚配時,組成的回溯,回溯的次數,正好是字符串的長度。
第二種非貪心婚配規矩,回溯5次,是正則【.+?】對字符串“123456”婚配時組成的回溯。回溯的次數,為字符串長度減去最小次數。也就是6-1=5次。假如正則表達式為【.*?】那末,回溯次數就是6次了。
第三種正則是零寬斷言,或許叫環顧。(暫且不說。)
在NFA正則引擎中,回溯是他的魂魄,所以,不論是貪心,非貪心,環顧等寫法中確定會有回溯的湧現的,這個我們沒法防止(用詞不太精確),然則,我們可以削減回溯的次數,或許掩護個中一部門婚配的規矩不停止回溯。

關於上篇BLOG上提到的鳥哥談到一個非貪心惹起的年夜量回溯成績,年夜家可以曉得,回溯,確切是糟蹋資本的禍首罪魁,那末,我們可否不讓其回溯呢?
謎底是確定的,NFA引擎中,有個概念,叫固化分組。援用一下書上的概念

詳細來講,應用「(?>…)」的婚配與正常的婚配並沒有差異,然則假如婚配停止到此構造以後(也就是,停止到閉括號以後),那末此構造體中的一切備用狀況都邑被廢棄。也就是說,在固化分組婚配停止時,它曾經婚配的文本曾經固化為一個單位,只能作為全體而保存或廢棄。括號內的子表達式中何嘗試過的備用狀況都不復存在了,所以回溯永久也不克不及選擇個中的狀況(至多是,當此構造婚配完成時,“鎖定(locked in)”在個中的狀況)。

那末,固化分組究竟有甚麼用途呢?我們來舉個例子。(找不到適合的例子,俺只好借用一下書上的例子了)
好比要處置一批數據,本來格局為123.456,後來由於浮點數顯示成績,部門數據格局變成123.456000000789這類,,請求做到只保存小數點前面2-3位,然則,最初一名不克不及為0,這個正則若何寫呢?(上面直接斟酌小數點前面的數字),寫出正則以後,我們還要用這個正則去婚配數據,把本來的數據調換成婚配的成果。
起首,我們可以連忙寫出如許的正則【\.\d\d[1-9]?\d*】,PHP代碼為

$str = preg_replace('\.(\d\d[1-9]?)\d*','\\1',$str); //婚配成果的group1停止反向援用

很顯著,這類寫法,關於部門數據格局為123.456的這類格局,白白的處置了一遍,為了進步效力,我們還要對這個正則停止處置。從123.456這個字符串跟其他的比擬一下,我們發明,是疑問123.456這個數據前面沒數字了,所以,白白處置一遍。那好辦,我們對這個正則改革一下,把前面的量詞*改成+,如許關於123.45 小數點前面1,2位數字的,不會去白白處置,並且,對三位以上數字的,處置正常。其PHP代碼為

$str = preg_replace('\.(\d\d[1-9]?)\d+','\\1',$str);

好了,這個正則真的沒成績嗎??肯定嗎?上篇博文,我們懂得了婚配道理,那末,我們也剖析一下這個正則的婚配進程吧。
字符串"123.456",正則表達式為【\.(\d\d[1-9]?)\d+】,我們來看下
起首(小數點前123不說了),【\.】婚配".",婚配勝利,把掌握權給下一個【\d】,【\d】婚配“4”勝利,把掌握權給第二個【\d】,這個【\d】婚配“5”勝利,然後,把掌握權給了【[1-9]?】,因為量詞是【?】,正則表達式遵守“量詞優先婚配”,並且,此處是【?】,還會留下一個回溯點。然後婚配"6"勝利,然後把掌握權給【\d+】,【\d+】發明前面沒字符了,最遵守“落後先出”規矩,回到上一個回溯點,停止婚配,這時候,【[1-9]?】會交還出其婚配的字符“6”,【[1-9]?】婚配“6”勝利。婚配完成了。年夜家發明【(\d\d[1-9]?)】婚配的成果確是"45",其實不是我們想要的“456”,“6”被【\d+】婚配去了。那末,我們該若何辦呢? 可否讓【[1-9]?】婚配一旦勝利,不停止回溯呢?這就用到了我們下面說的"固化分組", PHP(preg_replace函數)中應用的正則引擎支撐固化分組,我們依據固化分組的寫法,可以把代碼改成以下方法

$str = preg_replace('\.(\d\d(?>[1-9]?))\d+','\\1',$str);

改成如許的話,那字符串“123.456“是不相符請求,不會被婚配的。那我們便可以完成我們的請求了。

從下面的例子中,曉得了固化分組的感化,那末關於鳥哥BLOG上寫的誰人非貪心的回溯成績,我們可否也對其改革,使得其不回溯呢?
先看下鳥哥給的謎底

/<script>[^<]*<\/script>/is

鳥哥寫的很精干。消除“<”以外的一切字符都相符,並且,中央部門不回溯,效力高。可是,假如中央有字符“<“的話(以下代碼)

<script>
if a < b
</script>

那鳥哥的這個正則就不克不及婚配,就不克不及完成我們想要的功效了。
那我們可以依據 固化分組、環顧(零寬斷言)來完成這個請求,最初,CFC4N給出的正則和PHP代碼事例以下

$reg = '%<script>(?>[^<]*)(?>(?!</?script>)<[^<]*)*</script>%is';
$str = str_pad("<script>", 111111, "*"); //字符長度年夜於PHP回溯限制的100000
$str .= 'if a < b ; if b > c;</script>'; //隨意加幾個包括 < > 的測試字符
$ret = preg_replace($reg, "OK", $str);
print_r($ret); //打印成果 OK,證實婚配准確
var_dump(preg_last_error()); //上一次婚配毛病。其輸入為 int(0)

嗨,同窗,你看明確了嗎?

以上為小菜CFC4N的愚文,若有毛病,迎接指出。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved