日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则式简介及常用正则式

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则式简介及常用正则式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

好像很多公司招程序員都會考正則式,故搜了些東西與大家共享 (在此向原作者致敬!)????

?????? 剛準(zhǔn)備學(xué),自己也不懂。下面的一篇文章講的是PHP語言的正則式,好像各語言略有不同,有個講java正則式的ppt,下面給出了下載。文章最后是一些常用的正則式,看了那些常用的正則式應(yīng)該就知道正則式是干什么的以及它的優(yōu)越性了。

java正則式PPT下載

????? 1什么是正則表達(dá)式:

簡單的說,正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)大工具。在幾乎所有的基于UNIX/LINUX系統(tǒng)的軟件工具中找到正則表達(dá)式的痕跡,例如:Perl或PHP腳本語言。此外,JavaScript這種客戶端的腳本語言也提供了對正則表達(dá)式的支持,現(xiàn)在正則表達(dá)式已經(jīng)成為了一個通用的概念和工具,被各類技術(shù)人員所廣泛使用。

在某個Linux網(wǎng)站上面有這樣的話:"如果你問一下Linux愛好者最喜歡什么,他可能會回答正則表達(dá)式;如果你問他最害怕什么,除了繁瑣的安裝配置外他肯定會說正則表達(dá)式。"

正如上面說的,正則表達(dá)式看起來非常復(fù)雜,讓人害怕,大多數(shù)的PHP初學(xué)者都會跳過這里,繼續(xù)下面的學(xué)習(xí),但是PHP中的正則表達(dá)式有著可以利用模式匹配找到符合條件的字符串、判斷字符串是否合乎條件或者用指定的字符串來替代符合條件的字符串等強(qiáng)大的功能,不學(xué)實在太可惜了……

2 正則表達(dá)式的基本語法:

一個正則表達(dá)式,分為三個部分:分隔符,表達(dá)式和修飾符。

分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/"。表達(dá)式由一些特殊字符(特殊字符詳見下面)和非特殊的字符串組成,比如"[a-z0-9_-]+@[a-z0-9_-.]+"可以匹配一個簡單的電子郵件字符串。修飾符是用來開啟或者關(guān)閉某種功能/模式。下面就是一個完整的正則表達(dá)式的例子:

/hello.+?hello/is

上面的正則表達(dá)式"/"就是分隔符,兩個"/"之間的就是表達(dá)式,第二個"/"后面的字符串"is"就是修飾符。

在表達(dá)式中如果含有分隔符,那么就需要使用轉(zhuǎn)義符號"",比如"/hello.+?/hello/is"。轉(zhuǎn)義符號除了用于分隔符外還可以執(zhí)行特殊字符,全部由字母構(gòu)成的特殊字符都需要""來轉(zhuǎn)義,比如"d"代表全體數(shù)字。

3 正則表達(dá)式的特殊字符:

正則表達(dá)式中的特殊字符分為元字符、定位字符等等。

元字符是正則表達(dá)式中一類有特殊意義的字符,用來描述其前導(dǎo)字符(即元字符前面的字符)在被匹配的對象中出現(xiàn)的方式。元字符本身是一個個單一的字符,但是不同或者相同的元字符組合起來可以構(gòu)成大的元字符。

元字符:

大括號:大括號用來精確指定匹配元字符出現(xiàn)的次數(shù),例如"/pre{1,5}/"表示匹配的對象可以是"pre"、"pree"、"preeeee"這樣在"pr"后面出現(xiàn)1個到5個"e"的字符串。或者"/pre{,5}/"代表pre出現(xiàn)0此到5次之間。

加號:"+"字符用來匹配元字符前的字符出現(xiàn)一次或者多次。例如"/ac+/"表示被匹配的對象可以是"act"、"account"、"acccc"等在"a"后面出現(xiàn)一個或者多個"c"的字符串。"+"相當(dāng)于"{1,}"。

星號:"*"字符用來匹配元字符前的字符出現(xiàn)零次或者多次。例如"/ac*/"表示被匹配的對象可以是"app"、"acp"、"accp"等在"a"后面出現(xiàn)零個或者多個"c"的字符串。"*"相當(dāng)于"{0,}"。

問號:"?"字符用來匹配元字符前的字符出現(xiàn)零次或者1次。例如"/ac?/"表示匹配的對象可以是"a"、"acp"、"acwp"這樣在"a"后面出現(xiàn)零個或者1個"c"的字符串。"?"在正則表達(dá)式中還有一個非常重要的作用,即"貪婪模式"。

還有兩個很重要的特殊字符就是"[ ]"。他們可以匹配"[]"之中出現(xiàn)過的字符,比如"/[az]/"可以匹配單個字符"a"或者"z";如果把上面的表達(dá)式改成這樣"/[a-z]/",就可以匹配任何單個小寫字母,比如"a"、"b"等等。

如果在"[]"中出現(xiàn)了"^",代表本表達(dá)式不匹配"[]"內(nèi)出現(xiàn)的字符,比如"/[^a-z]/"不匹配任何小寫字母!并且正則表達(dá)式給出了幾種"[]"的默認(rèn)值:

[:alpha:]:匹配任何字母

[:alnum:]:匹配任何字母和數(shù)字

[:digit:]:匹配任何數(shù)字

[:space:]:匹配空格符

[:upper:]:匹配任何大寫字母

[:lower:]:匹配任何小寫字母

[:punct:]:匹配任何標(biāo)點(diǎn)符號

[:xdigit:]:匹配任何16進(jìn)制數(shù)字

另外下面這些特殊字符在轉(zhuǎn)義符號""轉(zhuǎn)義后代表的含義如下:

s:匹配單個的空格符

S:用于匹配除單個空格符之外的所有字符。

d:用于匹配從0到9的數(shù)字,相當(dāng)于"/[0-9]/"。

w:用于匹配字母,數(shù)字或下劃線字符,相當(dāng)于"/[a-zA-Z0-9_]/"。

W:用于匹配所有與w不匹配的字符,相當(dāng)于"/[^a-zA-Z0-9_]/"。

D:用于匹配任何非10進(jìn)制的數(shù)字字符。

.????? :用于匹配除換行符之外的所有字符,如果經(jīng)過修飾符"s"的修飾,"."可以代表任意字符。

利用上面的特殊字符可以很方便的表達(dá)一些比較繁瑣的模式匹配。例如"/d0000/"利用上面的正則表達(dá)式可以匹配萬以上,十萬一下的整數(shù)字符串。

定位字符:

定位字符是正則表達(dá)式中又一類非常重要的字符,它的主要作用是用于對字符在匹配對象中的位置進(jìn)行描述。

^:表示匹配的模式出現(xiàn)在匹配對象的開頭(和在"[]"里面不同)

$:表示匹配的模式出現(xiàn)在匹配對象的末尾

空格:表示匹配的模式出現(xiàn)在開始和結(jié)尾的兩個邊界之一

"/^he/":可以匹配以"he"字符開頭的字符串,比如hello、height等等;

"/he$/":可以匹配以"he"字符結(jié)尾的字符串即she等;

"/ he/":空格開頭,和^的作用一樣,匹配以he開頭的字符串;

"/he /":空格結(jié)束,和$的作用一樣,匹配以he結(jié)尾的字符串;

"/^he$/":表示只和字符串"he"匹配。

括號:

正則表達(dá)式除了可以用戶匹配,還可以用括號"()"來記錄需要的信息,儲存起來,給后面的表達(dá)式讀取。比如:

/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/

就是記錄郵件地址的用戶名,和郵件地址的服務(wù)器地址(形式為username@server.com之類的),在后面如果想要讀取記錄下來的字符串,只是需要用"轉(zhuǎn)義符+記錄的次序"來讀取。比如"1"就相當(dāng)于第一個"[a-zA-Z0-9_-]+","2"相當(dāng)于第二個([a-zA-Z0-9_-]+),"3"就是第三個(.[a-zA-Z0-9_-])。但是在PHP中,""是一個特殊的字符,需要轉(zhuǎn)義,所以""到了PHP的表達(dá)式中就應(yīng)該寫成"1"。

其他特殊符號:

"|":或符號"|"和PHP里面的或一樣,不過是一個"|",而不是PHP的兩個"||"!意思就是可以是某個字符或者另一個字符串,比如"/abcd|dcba/"可能匹配"abcd"或者"dcba"。

4 貪婪模式:

前面在元字符中提到過"?"還有一個重要的作用,即"貪婪模式",什么是"貪婪模式"呢?

比如我們要匹配以字母"a"開頭字母"b"結(jié)尾的字符串,但是需要匹配的字符串在"a"后面含有很多個"b",比如"a bbbbbbbbbbbbbbbbb",那正則表達(dá)式是會匹配第一個"b"還是最后一個"b"呢?如果你使用了貪婪模式,那么會匹配到最后一個"b",反之只是匹配到第一個"b"。

使用貪婪模式的表達(dá)式如下:

/a.+?b/

/a.+b/U

不使用貪婪模式的如下:

/a.+b/

上面使用了一個修飾符U,詳見下面的部分。

5 修飾符:

在正則表達(dá)式里面的修飾符可以改變正則的很多特性,使得正則表達(dá)式更加適合你的需要(注意:修飾符對于大小寫是敏感的,這意味著"e"并不等于"E")。正則表達(dá)式里面的修飾符如下:

i :如果在修飾符中加上"i",則正則將會取消大小寫敏感性,即"a"和"A" 是一樣的。

m:默認(rèn)的正則開始"^"和結(jié)束"$"只是對于正則字符串如果在修飾符中加上"m",那么開始和結(jié)束將會指字符串的每一行:每一行的開頭就是"^",結(jié)尾就是"$"。

s:如果在修飾符中加入"s",那么默認(rèn)的"."代表除了換行符以外的任何字符將會變成任意字符,也就是包括換行符!

x:如果加上該修飾符,表達(dá)式中的空白字符將會被忽略,除非它已經(jīng)被轉(zhuǎn)義。

e:本修飾符僅僅對于replacement有用,代表在replacement中作為PHP代碼。

A:如果使用這個修飾符,那么表達(dá)式必須是匹配的字符串中的開頭部分。比如說"/a/A"匹配"abcd"。

E:與"m"相反,如果使用這個修飾符,那么"$"將匹配絕對字符串的結(jié)尾,而不是換行符前面,默認(rèn)就打開了這個模式。

U:和問號的作用差不多,用于設(shè)置"貪婪模式"。

6 PCRE相關(guān)的正則表達(dá)式函數(shù):

PHP的Perl兼容正則表達(dá)式提供的多個函數(shù),分為模式匹配,替換和匹配數(shù)目等等:

1、preg_match :

函數(shù)格式:int preg_match(string pattern, string subject, array [matches]);

這個函數(shù)會在string中使用pattern表達(dá)式來匹配,如果給定了[regs],就會將string記錄到[regs][0]中,[regs][1]代表使用括號"()"記錄下來的第一個字符串,[regs][2]代表記錄下來的第二個字符串,以此類推。preg如果在string中找到了匹配的pattern,就會返回"true",否則返回"false"。

2、preg_replace :

函數(shù)格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);

這個函數(shù)會使用將string中符合表達(dá)式pattern的字符串全部替換為表達(dá)式replacement。如果replacement中需要包含pattern的部分字符,則可以使用"()"來記錄,在replacement中只是需要用"1"來讀取。

3、preg_split :

函數(shù)格式:array preg_split(string pattern, string subject, int [limit]);

這個函數(shù)和函數(shù)split一樣,區(qū)別僅在與split可以使用簡單正則表達(dá)式來分割匹配的字符串,而preg_split使用完全的Perl兼容正則表達(dá)式。第三個參數(shù)limit代表允許返回多少個符合條件的值。

4、preg_grep :

函數(shù)格式:array preg_grep(string patern , array input);

這個函數(shù)和preg_match功能基本上,不過preg_grep可以將給定的數(shù)組input中的所有元素匹配,返回一個新的數(shù)組。

下面舉一個例子,比如我們要檢查Email地址的格式是否正確:

function emailIsRight($email) {
if (preg_match("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email)) {
return 1;
}
return 0;
}
if(emailIsRight([email=]'y10k@963.net'[/email])) echo '正確
';
if(!emailIsRight([email=]'y10k@fffff'[/email])) echo '不正確
';
?>

上面的程序會輸出"正確

不正確"。

常用正則式

匹配長度不少于6位的正則式:[/s/S]{6,}

匹配中文字符的正則表達(dá)式: [/u4e00-/u9fa5]
評注:匹配中文還真是個頭疼的事,有了這個表達(dá)式就好辦了

匹配雙字節(jié)字符(包括漢字在內(nèi)):[^/x00-/xff]
評注:可以用來計算字符串的長度(一個雙字節(jié)字符長度計2,ASCII字符計1)

匹配空白行的正則表達(dá)式:/n/s*/r
評注:可以用來刪除空白行

匹配HTML標(biāo)記的正則表達(dá)式:<(/S*?)[^>]*>.*?|<.*? />
評注:網(wǎng)上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復(fù)雜的嵌套標(biāo)記依舊無能為力

匹配首尾空白字符的正則表達(dá)式:^/s*|/s*$
評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達(dá)式

匹配Email地址的正則表達(dá)式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
評注:表單驗證時很實用

匹配網(wǎng)址URL的正則表達(dá)式:[a-zA-z]+://[^/s]*
評注:網(wǎng)上流傳的版本功能很有限,上面這個基本可以滿足需求

匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用

匹配國內(nèi)電話號碼:/d{3}-/d{8}|/d{4}-/d{7}
評注:匹配形式如 0511-4405222 或 021-87888822

匹配QQ號:[1-9][0-9]{4,}
評注:騰訊QQ號從10000開始

匹配中國郵政編碼:[1-9]/d{5}(?!/d)
評注:中國郵政編碼為6位數(shù)字

匹配身份證:/d{15}|/d{18}
評注:中國的身份證為15位或18位

匹配ip地址:/d+/./d+/./d+/./d+
評注:提取ip地址時有用

匹配特定數(shù)字:
^[1-9]/d*$ //匹配正整數(shù)
^-[1-9]/d*$ //匹配負(fù)整數(shù)
^-?[1-9]/d*$ //匹配整數(shù)
^[1-9]/d*|0$ //匹配非負(fù)整數(shù)(正整數(shù) + 0)
^-[1-9]/d*|0$ //匹配非正整數(shù)(負(fù)整數(shù) + 0)
^[1-9]/d*/./d*|0/./d*[1-9]/d*$ //匹配正浮點(diǎn)數(shù)
^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$ //匹配負(fù)浮點(diǎn)數(shù)
^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0)$ //匹配浮點(diǎn)數(shù)
^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$ //匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)
^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$ //匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)
評注:處理大量數(shù)據(jù)時有用,具體應(yīng)用時注意修正

匹配特定字符串:
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數(shù)字和26個英文字母組成的字符串
^/w+$ //匹配由數(shù)字、26個英文字母或者下劃線組成的字符串
評注:最基本也是最常用的一些表達(dá)式


電子郵件:[_a-z0-9-]+(/.[_a-z0-9-]+)*@[a-z0-9-]+(/.[a-z0-9-]+)+$????
或者:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配中文字符的正則表達(dá)式: [u4e00-u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^x00-xff]
匹配空行的正則表達(dá)式:n[s| ]*r
匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*|<(.*) />/
匹配首尾空格的正則表達(dá)式:(^s*)|(s*$)
匹配ip地址:/d+/./d+/./d+/./d+

匹配網(wǎng)址URL的正則表達(dá)式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
匹配國內(nèi)電話號碼:(d{3}-|d{4}-)?(d{8}|d{7})?
匹配身份證:/d{15}|/d{18}
匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$
匹配中文字符的正則表達(dá)式: [/u4e00-/u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^/x00-/xff]
匹配空行的正則表達(dá)式:/n[/s| ]*/r
匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*|<(.*) //>/??
匹配首尾空格的正則表達(dá)式:(^/s*)|(/s*$)(像vbscript那樣的trim函數(shù))
匹配Email地址的正則表達(dá)式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
匹配網(wǎng)址URL的正則表達(dá)式:http://([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?

from:http://hi.baidu.com/yxhsunshine/blog/item/2e3f3458396c1ada9c8204b8.html

總結(jié)

以上是生活随笔為你收集整理的正则式简介及常用正则式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。