程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> You must SET PASSWORD before executing this statement的處理辦法

You must SET PASSWORD before executing this statement的處理辦法

編輯:MySQL綜合教程

You must SET PASSWORD before executing this statement的處理辦法。本站提示廣大學習愛好者:(You must SET PASSWORD before executing this statement的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是You must SET PASSWORD before executing this statement的處理辦法正文


本文是前一片文章《正則表達式具體引見(上)》的續篇,在本文中講述了正則表達式中的組與向後援用,先前向後檢查,前提測試,單詞界限,選擇符等表達式及例子,並剖析了正則引擎在履行婚配時的外部機理。
9. 單詞界限

元字符<<\b>>也是一種對地位停止婚配的“錨”。這類婚配是0長度婚配。

有4種地位被以為是“單詞界限”:

1) 在字符串的第一個字符前的地位(假如字符串的第一個字符是一個“單詞字符”)

2) 在字符串的最初一個字符後的地位(假如字符串的最初一個字符是一個“單詞字符”)

3) 在一個“單詞字符”和“非單詞字符”之間,個中“非單詞字符”緊跟在“單詞字符”以後

4) 在一個“非單詞字符”和“單詞字符”之間,個中“單詞字符”緊跟在“非單詞字符”前面

“單詞字符”是可以用“\w”婚配的字符,“非單詞字符”是可以用“\W”婚配的字符。在年夜多半的正則表達式完成中,“單詞字符”平日包含<<[a-zA-Z0-9_]>>。

例如:<<\b4\b>>可以或許婚配單個的4而不是一個更年夜數的一部門。這個正則表達式不會婚配“44”中的4。

換種說法,簡直可以說<<\b>>婚配一個“字母數字序列”的開端和停止的地位。

“單詞界限”的取反集為<<\B>>,他要婚配的地位是兩個“單詞字符”之間或許兩個“非單詞字符”之間的地位。

深刻正則表達式引擎外部

讓我們看看把正則表達式<<\bis\b>>運用到字符串“This island is beautiful”。引擎先處置符號<<\b>>。由於\b是0長度 ,所以第一個字符T後面的地位會被考核。由於T是一個“單詞字符”,而它後面的字符是一個空字符(void),所以\b婚配了單詞界限。接著<<i>>和第一個字符“T”婚配掉敗。婚配進程持續停止,直到第五個空格符,和第四個字符“s”之間又婚配了<<\b>>。

但是空格符和<<i>>不婚配。持續向後,到了第六個字符“i”,和第五個空格字符之間婚配了<<\b>>,然後<<is>>和第6、第七個字符都婚配了。但是第八個字符和第二個“單詞界限”不婚配,所以婚配又掉敗了。到了第13個字符i,由於和後面一個空格符構成“單詞界限”,同時<<is>>和“is”婚配。引擎接著測驗考試婚配第二個<<\b>>。由於第15個空格符和“s”構成單詞界限,所以婚配勝利。引擎“急著”前往勝利婚配的成果。

10. 選擇符

正則表達式中“|”表現選擇。你可以用選擇符婚配多個能夠的正則表達式中的一個。

假如你想搜刮文字“cat”或“dog”,你可以用<<cat|dog>>。假如你想有更多的選擇,你只需擴大列表<<cat|dog|mouse|fish>>。

選擇符在正則表達式中具有最低的優先級,也就是說,它告知引擎要末婚配選擇符右邊的一切表達式,要末婚配左邊的一切表達式。你也能夠用圓括號來限制選擇符的感化規模。如<<\b(cat|dog)\b>>,如許告知正則引擎把(cat|dog)當做一個正則表達式單元來處置。

留意正則引擎的“急於表功”性

正則引擎是迫切的,當它找到一個有用的婚配時,它會停滯搜刮。是以在必定前提下,選擇符雙方的表達式的次序對成果會有影響。假定你想用正則表達式搜刮一個編程說話的函數列表:Get,GetValue,Set或SetValue。一個顯著的處理計劃是<<Get|GetValue|Set|SetValue>>。讓我們看看當搜刮SetValue時的成果。

由於<<Get>>和<<GetValue>>都掉敗了,而<<Set>>婚配勝利。由於正則導向的引擎都是“迫切”的,所以它會前往第一個勝利的婚配,就是“Set”,而不去持續搜刮能否有其他更好的婚配。

和我們希冀的相反,正則表達式並沒有婚配全部字符串。有幾種能夠的處理方法。一是斟酌到正則引擎的“迫切”性,轉變選項的次序,例如我們應用<<GetValue|Get|SetValue|Set>>,如許我們便可以優先搜刮最長的婚配。我們也能夠把四個選項聯合起來成兩個選項:<<Get(Value)?|Set(Value)?>>。由於問號反復符是貪心的,所以SetValue總會在Set之前被婚配。

一個更好的計劃是應用單詞界限:<<\b(Get|GetValue|Set|SetValue)\b>>或<<\b(Get(Value)?|Set(Value)?\b>>。更進一步,既然一切的選擇都有雷同的開頭,我們可以把正則表達式優化為<<\b(Get|Set)(Value)?\b>>。

11. 組與向後援用

把正則表達式的一部門放在圓括號內,你可以將它們構成組。然後你可以對全部組應用一些正則操作,例如反復操作符。

要留意的是,只要圓括號“()”能力用於構成組。“[]”用於界說字符集。“{}”用於界說反復操作。

當用“()”界說了一個正則表達式組後,正則引擎則會把被婚配的組依照次序編號,存入緩存。當對被婚配的組停止向後援用的時刻,可以用“\數字”的方法停止援用。<<\1>>援用第一個婚配的後向援用組,<<\2>>援用第二個組,以此類推,<<\n>>援用第n個組。而<<\0>>則援用全部被婚配的正則表達式自己。我們看一個例子。

假定你想婚配一個HTML標簽的開端標簽和停止標簽,和標簽中央的文本。好比<B>This is a test</B>,我們要婚配<B>和</B>和中央的文字。我們可以用以下正則表達式:“<([A-Z][A-Z0-9]*)[^>]*>.*?</\1>”

起首,“<”將會婚配“<B>”的第一個字符“<”。然後[A-Z]婚配B,[A-Z0-9]*將會婚配0到屢次字母數字,前面緊接著0到多個非“>”的字符。最初正則表達式的“>”將會婚配“<B>”的“>”。接上去正則引擎將對停止標簽之前的字符停止惰性婚配,直到碰到一個“</”符號。然後正則表達式中的“\1”表現對後面婚配的組“([A-Z][A-Z0-9]*)”停止援用,在本例中,被援用的是標簽名“B”。所以須要被婚配的開頭標簽為“</B>”

你可以對雷同的後向援用組停止屢次援用,<<([a-c])x\1x\1>>將婚配“axaxa”、“bxbxb”和“cxcxc”。假如用數字情勢援用的組沒有有用的婚配,則援用到的內容簡略的為空。

一個後向援用不克不及用於它本身。<<([abc]\1)>>是毛病的。是以你不克不及將<<\0>>用於一個正則表達式婚配自己,它只能用於調換操作中。

後向援用不克不及用於字符集外部。<<(a)[\1b]>>中的<<\1>>其實不表現後向援用。在字符集外部,<<\1>>可以被說明為八進制情勢的轉碼。

向後援用會下降引擎的速度,由於它須要存儲婚配的組。假如你不須要向後援用,你可以告知引擎對某個組不存儲。例如:<<Get(?:Value)>>。個中“(”前面緊跟的“?:”會告知引擎關於組(Value),不存儲婚配的值以供後向援用。

(1)反復操作與後向援用

當對組應用反復操作符時,緩存裡後向援用內容會被赓續刷新,只保存最初婚配的內容。例如:<<([abc]+)=\1>>將婚配“cab=cab”,然則<<([abc])+=\1>>卻不會。由於([abc])第一次婚配“c”時,“\1”代表“c”;然後([abc])會持續婚配“a”和“b”。最初“\1”代表“b”,所以它會婚配“cab=b”。

運用:檢討反復單詞--當編纂文字時,很輕易就會輸出反復單詞,例如“the the”。應用<<\b(\w+)\s+\1\b>>可以檢測到這些反復單詞。要刪除第二個單詞,只需簡略的應用調換功效調換失落“\1”便可以了。

(2)組的定名和援用

在PHP,Python中,可以用<<(?P<name>group)>>來對組停止定名。在本例中,詞法?P<name>就是對組(group)停止了定名。個中name是你對組的起的名字。你可以用(?P=name)停止援用。

.NET的定名組

.NET framework也支撐定名組。不幸的是,微軟的法式員們決議創造他們本身的語法,而不是沿用Perl、Python的規矩。今朝為止,還沒有任何其他的正則表達式完成支撐微軟創造的語法。

上面是.NET中的例子:

(?<first>group)(?'second'group)

正如你所看到的,.NET供給兩種詞法來創立定名組:一是用尖括號“<>”,或許用單引號“''”。尖括號在字符串中應用更便利,單引號在ASP代碼中更有效,由於ASP代碼中“<>”被用作HTML標簽。

要援用一個定名組,應用\k<name>或\k'name'.

當停止搜刮調換時,你可以用“${name}”來援用一個定名組。

12. 正則表達式的婚配形式

本教程所評論辯論的正則表達式引擎都支撐三種婚配形式:

<</i>>使正則表達式對年夜小寫不敏感,

<</s>>開啟“單行形式”,即點號“.”婚配新行符

<</m>>開啟“多行形式”,即“^”和“$”婚配新行符的後面和前面的地位。

在正則表達式外部翻開或封閉形式

假如你在正則表達式外部拔出潤飾符(?ism),則該潤飾符只對其左邊的正則表達式起感化。(?-i)是封閉年夜小寫不敏感。你可以很快的停止測試。<<(?i)te(?-i)st>>應當婚配TEst,然則不克不及婚配teST或TEST.

13. 原子組與避免回溯

在一些特別情形下,由於回溯會使得引擎的效力極端低下。

讓我們看一個例子:要婚配如許的字串,字串中的每一個字段間用逗號做分隔符,第12個字段由P開首。

我們輕易想到如許的正則表達式<<^(.*?,){11}P>>。這個正則表達式在正常情形下任務的很好。然則在極端情形下,假如第12個字段不是由P開首,則會產生災害性的回溯。如要搜刮的字串為“1,2,3,4,5,6,7,8,9,10,11,12,13”。起首,正則表達式一向勝利婚配直到第12個字符。這時候,後面的正則表達式消費的字串為“1,2,3,4,5,6,7,8,9,10,11,”,到了下一個字符,<<P>>其實不婚配“12”。所以引擎停止回溯,這時候正則表達式消費的字串為“1,2,3,4,5,6,7,8,9,10,11”。持續下一次婚配進程,下一個正則符號為點號<<.>>,可以婚配下一個逗號“,”。但是<<,>>其實不婚配字符“12”中的“1”。婚配掉敗,持續回溯。年夜家可以想象,如許的回溯組合是個異常年夜的數目。是以能夠會形成引擎瓦解。

用於阻攔如許偉大的回溯有幾種計劃:

一種簡略的計劃是盡量的使婚配准確。用取反字符集取代點號。例如我們用以下正則表達式<<^([^,\r\n]*,){11}P>>,如許可使掉敗回溯的次數降低到11次。

另外一種計劃是應用原子組。

原子組的目標是使正則引擎掉敗的更快一點。是以可以有用的阻攔海量回溯。原子組的語法是<<(?>正則表達式)>>。位於(?>)之間的一切正則表達式都邑被以為是一個單一的正則符號。一旦婚配掉敗,引擎將會回溯到原子組後面的正則表達式部門。後面的例子用原子組可以表殺青<<^(?>(.*?,){11})P>>。一旦第十二個字段婚配掉敗,引擎回溯到原子組後面的<<^>>。

14. 向前檢查與向後檢查

Perl 5 引入了兩個壯大的正則語法:“向前檢查”和“向後檢查”。他們也被稱作“零長度斷言”。他們和錨定一樣都是零長度的(所謂零長度即指該正則表達式不用耗被婚配的字符串)。分歧的地方在於“前後檢查”會現實婚配字符,只是他們會擯棄婚配只前往婚配成果:婚配或不婚配。這就是為何他們被稱作“斷言”。他們其實不現實消費字符串中的字符,而只是斷言一個婚配能否能夠。

簡直本文評論辯論的一切正則表達式的完成都支撐“向前向後檢查”。獨一的一個破例是Javascript只支撐向前檢查。

(1)確定和否認式的向前檢查

如我們後面提過的一個例子:要查找一個q,前面沒有緊跟一個u。也就是說,要末q前面沒有字符,要末前面的字符不是u。采取否認式向前檢查後的一個處理計劃為<<q(?!u)>>。否認式向前檢查的語法是<<(?!檢查的內容)>>。

確定式向前檢查和否認式向前檢查很相似:<<(?=檢查的內容)>>。

假如在“檢查的內容”部門有組,也會發生一個向後援用。然則向前檢查自己其實不會發生向後援用,也不會被計入向後援用的編號中。這是由於向前檢查自己是會被擯棄失落的,只保存婚配與否的斷定成果。假如你想保存婚配的成果作為向後援用,你可以用<<(?=(regex))>>來發生一個向後援用。

(2)確定和否認式的前後檢查

向後檢查和向前檢查有雷同的後果,只是偏向相反

否認式向後檢查的語法是:<<(?<!檢查內容)>>

確定式向後檢查的語法是:<<(?<=檢查內容)>>

我們可以看到,和向前檢查比擬,多了一個表現偏向的左尖括號。

例:<<(?<!a)b>>將會婚配一個沒有“a”作前導字符的“b”。

值得留意的是:向前檢查從以後字符串地位開端對“檢查”正則表達式停止婚配;向後檢查則從以後字符串地位開端前後回溯一個字符,然後再開端對“檢查”正則表達式停止婚配。

(3)深刻正則表達式引擎外部

讓我們看一個簡略例子。

把正則表達式<<q(?!u)>>運用到字符串“Iraq”。正則表達式的第一個符號是<<q>>。正如我們曉得的,引擎在婚配<<q>>之前會掃過全部字符串。當第四個字符“q”被婚配後,“q”前面是空字符(void)。而下一個正則符號是向前檢查。引擎留意到曾經進入了一個向前檢查正則表達式部門。下一個正則符號是<<u>>,和空字符不婚配,從而招致向前檢查裡的正則表達式婚配掉敗。由於是一個否認式的向前檢查,意味著全部向前檢查成果是勝利的。因而婚配成果“q”被前往了。

我們在把雷同的正則表達式運用到“quit”。<<q>>婚配了“q”。下一個正則符號是向前檢查部門的<<u>>,它婚配了字符串中的第二個字符“i”。引擎持續走到下個字符“i”。但是引擎這時候留意到向前檢查部門曾經處置完了,而且向前檢查曾經勝利。因而引擎擯棄被婚配的字符串部門,這將招致引擎回退到字符“u”。

由於向前檢查能否定式的,意味著檢查部門的勝利婚配招致了全部向前檢查的掉敗,是以引擎不能不停止回溯。最初由於再沒有其他的“q”和<<q>>婚配,所以全部婚配掉敗了。

為了確保你能清晰地輿解向前檢查的完成,讓我們把<<q(?=u)i>>運用到“quit”。<<q>>起首婚配“q”。然後向前檢查勝利婚配“u”,婚配的部門被擯棄,只前往可以婚配的斷定成果。引擎從字符“i”回退到“u”。因為向前檢查勝利了,引擎持續處置下一個正則符號<<i>>。成果發明<<i>>和“u”不婚配。是以婚配掉敗了。因為前面沒有其他的“q”,全部正則表達式的婚配掉敗了。

(4)更進一步懂得正則表達式引擎外部機制

讓我們把<<(?<=a)b>>運用到“thingamabob”。引擎開端處置向後檢查部門的正則符號和字符串中的第一個字符。在這個例子中,向後檢查告知正則表達式引擎回退一個字符,然後檢查能否有一個“a”被婚配。由於在“t”後面沒有字符,所以引擎不克不及回退。是以向後檢查掉敗了。引擎持續走到下一個字符“h”。再一次,引擎臨時回退一個字符並檢討能否有個“a”被婚配。成果發明了一個“t”。向後檢查又掉敗了。

向後檢查持續掉敗,直到正則表達式達到了字符串中的“m”,因而確定式的向後檢查被婚配了。由於它是零長度的,字符串確當前地位依然是“m”。下一個正則符號是<<b>>,和“m”婚配掉敗。下一個字符是字符串中的第二個“a”。引擎向後臨時回退一個字符,而且發明<<a>>不婚配“m”。

鄙人一個字符是字符串中的第一個“b”。引擎臨時性的向撤退退卻一個字符發明向後檢查被知足了,同時<<b>>婚配了“b”。是以全部正則表達式被婚配了。作為成果,正則表達式前往字符串中的第一個“b”。

(5)向前向後檢查的運用

我們來看如許一個例子:查找一個具有6位字符的,含有“cat”的單詞。

起首,我們可以不消向前向後檢查來處理成績,例如:

<< cat\w{3}|\wcat\w{2}|\w{2}cat\w|\w{3}cat>>

足夠簡略吧!然則當需求釀成查找一個具有6-12位字符,含有“cat”,“dog”或“mouse”的單詞時,這類辦法就變得有些愚笨了。

我們來看看應用向前檢查的計劃。在這個例子中,我們有兩個根本需求要知足:一是我們須要一個6位的字符,二是單詞含有“cat”。

知足第一個需求的正則表達式為<<\b\w{6}\b>>。知足第二個需求的正則表達式為<<\b\w*cat\w*\b>>。

把二者聯合起來,我們可以獲得以下的正則表達式:

<<(?=\b\w{6}\b)\b\w*cat\w*\b>>

詳細的婚配進程留給讀者。然則要留意的一點是,向前檢查是不用耗字符的,是以當斷定單詞知足具有6個字符的前提後,引擎會從開端斷定前的地位持續對前面的正則表達式停止婚配。

最初作些優化,可以獲得上面的正則表達式:

<<\b(?=\w{6}\b)\w{0,3}cat\w*>>

15. 正則表達式中的前提測試

前提測試的語法為<<(?ifthen|else)>>。“if”部門可所以向前向後檢查表達式。假如用向前檢查,則語法變成:<<(?(?=regex)then|else)>>,個中else部門是可選的。

假如if部門為true,則正則引擎會試圖婚配then部門,不然引擎會試圖婚配else部門。

須要記住的是,向前前後檢查其實不現實消費任何字符,是以前面的then與else部門的婚配時從if測試前的部門開端停止測驗考試。

16. 為正則表達式添加正文

在正則表達式中添加正文的語法是:<<(?#comment)>>

例:為用於婚配有用日期的正則表達式添加正文:

(?#year)(19|20)\d\d[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])

到這裡,正則表達式的常識,就引見完了!願望對你有贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved