正規表示式用法

2021-04-13 03:15:31 字數 4427 閱讀 4031

正規表示式的概念

什麼是ubb**?什麼是正規表示式?

ubb**是html的乙個變種。一般情況下,ubb論壇不允許你使用html**,而只能用ubb**替代html**。

ubb**是一套由流行的ubb標籤組成了固定**,**有統一的格式。使用者只要遵循**規則就可以實現使用者想要的功能。如:

想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入how are you

你也許會問:asp是怎樣把 how are you轉換為how are you的呢?

回答這個問題就是:用正規表示式。

三、正規表示式的用途

有時我們在製作**表單資料處理的時候,都需要進行資料驗證和字串替代,特別是ubb論壇要進行大量的資料安全性和字串替代

郵於一般的論壇不支援html語法這就使得使用者不能修改字型,不能貼圖等等一些功能。這樣使得論壇失去了吸引使用者的乙個強有力的途徑。可能說乙個強大的論壇在吸引使用者數量上還是很重要的。這樣就出現了乙個ubb解決方案,即在論壇不支援html語法的情況下使用者仍然可以定製自已貼子的樣式,貼圖,增加鏈結,轉貼網頁等等諸多的功能,可能達到支援html語法同樣的效果,而且這樣可以使得論壇相對於html的論壇安全性大大提高。使用者基本不能對論壇過行任何惡意攻擊。

四、正規表示式的語法規則和標記

字元描述:

^符號匹配字串的開頭。例如:

^abc 與「abc xyz」匹配,而不與「xyz abc」匹配

$符號匹配字串的結尾。例如:

abc$ 與「xyz abc」匹配,而不與「abc xyz」匹配。

注意:如果同時使用^符號和$符號,將進行精確匹配。例如:

^abc$ 只與「abc」匹配   

*符號匹配0個或多個前面的字元。例如:

ab* 可以匹配「ab」、「abb」、「abbb」等

+符號匹配至少乙個前面的字元。例如:

ab+ 可以匹配「abb」、「abbb」等,但不匹配「ab」。

?符號匹配0個或1個前面的字元。例如:

ab?c? 可以且只能匹配「abc」、「abbc」、「abcc」和「abbcc」

.符號匹配除換行符以外的任何字元。例如:

(.)+ 匹配除換行符以外的所有字串

x|y匹配「x」或「y」。例如:

abc|xyz 可匹配 「abc」或 「xyz」,而「ab(c|x)yz」匹配 「abcyz」和「abxyz」

匹配恰好n次(n為非負整數)前面的字元。例如:

a 可以匹配「aa「,但不匹配「a」

匹配至少n次(n為非負整數)前面的字元。例如:

a 匹配「aaa」、「aaaa」等,但不匹配「a」和「aa」。

注意:a等價於a+

a等價於a*

匹配至少m個,至多n個前面的字元。例如:

a 只匹配「a」、「aa」和「aaa」。

注意:a等價於a?

[xyz]表示乙個字符集,匹配括號中字元的其中之一。例如:

[abc] 匹配「a」、「b」和「c」

[^xyz]表示乙個否定的字符集。匹配不在此括號中的任何字元。例如:

[^abc] 可以匹配除「a」、「b」和「c」之外的任何字元

[a-z]表示某個範圍內的字元,匹配指定區間內的任何字元。例如:

[a-z] 匹配從「a」到「z」之間的任何乙個小寫字母字元

[^m-n]表示某個範圍之外的字元,匹配不在指定範圍內的字元。例如:

[m-n] 匹配除從「m」到「n」之間的任何字元

/符號是轉義操作符。例如:

/n 換行符

/f 分頁符

/r 回車

/t 製表符

/v 垂直製表符

// 匹配「/」

// 匹配「/」

/s 任何白字元,包括空格、製表符、分頁符等。等價於「[ /f/n/r/t/v]」

/s 任何非空白的字元。等價於「^/f/n/r/t/v]」

/w 任何單詞字元,包括字母和下劃線。等價於「[a-za-z0-9_]」

/w 任何非單詞字元。等價於「[^a-za-z0-9_]」

/b匹配單詞的結尾。例如:

ve/b 匹配單詞「love」等,但不匹配「very」、「even」等

/b匹配單詞的開頭。例如:

ve/b 匹配單詞「very」等,但不匹配「love」等

/d匹配乙個數字字元,等價於[0-9]。例如:

abc/dxyz 匹配「abc2xyz」、「abc4xyz」等,但不匹配「abcaxyz」、「abc-xyz」等

/d匹配乙個非數字字元,等價於[^0-9]。例如:

abc/dxyz 匹配「abcaxyz」、「abc-xyz」等,但不匹配「abc2xyz」、「abc4xyz」等

/num匹配num個(其中num為乙個正整數),引用回到記住的匹配。例如:

(.)/1 匹配兩個連續相同的字元。

/onum匹配n(其中n為乙個小於256的八進位製換碼值)。例如:

/o011 匹配製表符

/xnum匹配num(其中num為乙個小於256的十六進製製換碼值)。例如:

/x41 匹配字元「a」

五、例項分析

1)在字串中精確查詢鏈結位址

條件1以http://或者https://或者ftp://等開頭(當然還有其它形式,這裡只列出主要的)

條件2http://後面必須跟乙個單詞字元,緊接著單詞字元後面的是"."(這樣的組合必須出現一次或多次)。緊跟著「.」後面的是網域名稱字尾(如net或者com或者cn等,如果是以ip位址的形式出現就可以是數字)

條件3條件4

鏈結位址末尾可以帶引數。如典型的頁數?pageno=2&action=display等

現在我們用下面的**來逐個匹配上面的條件——

1、((http|https|ftp)|) 滿足條件1

表示http:// http:// https:// https:// ftp:// ftp://都匹配(在這裡考慮了某些使用者可能把"//"輸成「//」的易發性錯誤)

注意:"|"表示「或者」,"/"是轉義字元。「」表示"//",「」表示"//"

2、((/w)+[.])(net|com|cn|org|cc|tv|[0-9]) 滿足條件2

「((/w)+[.])」表示乙個單詞字元加乙個點號可以出現1次或者多次(這裡考慮了某些使用者喜歡省略www而將

http://www.w3c.com寫成

「(net|com|cn|org|cc|tv|[0-9])」表示必須要以net或者com或者cn或者org或者cc或者tv或者三位以下的數字結束

[0-9]表示三位以下的數字,因為ip位址的任何段不能超過255

3、(((//[/~]*|//[/~]*)(/w)+)|[.](/w)+)* 滿足條件3

「(/w)+)|[.](/w)+)」表示必須出現乙個單詞字元(即目錄或者是乙個帶有副檔名的檔案)

4、(((([?](/w)+)[=]*))*((/w)+)([/&](/w)+[/=](/w)+)*)*)滿足條件4

「((([?](/w)+)[=]*))*((/w)+)」表示形如"?pageno=2"的字串可以出現也可以不出現,如果出現則只能出現一次(因為不可能有兩個「?」號出現)。

「([/&](/w)+[/=](/w)+)*)」表示形如「&action=display」的字串可以出現也可以不出現(因為並不是每個網頁都帶有兩個以上的引數。

整個「((([?](/w)+)[=]*))*((/w)+)([/&](/w)+[/=](/w)+)*)*」表示形如「?pageno=2&action=display」的字串可以出現也可以不出現(即鏈結位址可以有引數也可以沒有引數)

把上面的組合起來,我們就可以匹配乙個比較全面的鏈結位址了。比用簡單的「(http:/s+)」來匹配乙個鏈結位址要好,讀者可以自行行測試比較。當然,這段**還有很多不足之處,希望大家能夠繼續改進。

2)替代典型的ubb標籤:

我們的目的就是要把成對的替換成下面來看我們實現它的模板

(/[b/])(.+)(/[//b/])

這裡用了"(.+)"來配匹到之間的整個字串,在替代的時候我們要寫成這樣

str=checkexp(re,str,"$2"

(注意:checkexp是我自定義的函式,將在後面給出。這個函式將把按照我們提供的模板進行替代。)

也許你會問這裡出現乙個"$2"是什麼東東,呵注意了這個$2可是很重要的,它代表了"(.+)"所配匹的整個字串。

為什麼是$2而不是$1、$3呢?因為$1代表(/[b/])所匹配的""字串,$3代表(/[//b/])所匹配的""字串,顯然這裡我們需要的是$2而不是$1$3。

正規表示式用法

乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 後向引用 或乙個八進位制轉義符。例如,...

正規表示式用法

1 正規表示式 理解 1 就是符合一定規則的字串 2 常見規則 a 字元 x 字元 x。舉例 a 表示字元a 反斜線字元。n 新行 換行 符 u000a r 回車符 u000d b 字元類 abc a b 或 c 簡單類 abc 任何字元,除了 a b 或 c 否定 a za z a到 z 或 a到...

正規表示式用法

今天遇到乙個格式化字串輸入函式如下 char pcuserhdr abc username inte ce sscanf pcuserhdr,acusername,acinte ce 對此學習了下,輸出乙個總結 1.sscanf函式原型不多做解釋,直接以乙個例子開始 sscanf buf,get b...