正則表達式知識詳解(轉自晴天碧日)

一、什么是正則表達式?

1.定義:

正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。

2.組成:

正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。

3.何時使用:驗證——從頭到尾完整匹配!

????????????查找——只要部分匹配即可!

二、正則表達式的基本語法和規則

?1.備選字符集:規定某*一位字符*可用的備選字符的集合

??????語法:[可選字符列表]

??????強調:1.?無論備選字符集包含多少字符,只能選1個

????????????2.?必須選1個!

??????比如:6位數字的密碼

[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]

?????簡化:1.?當備選字符連續時,可用-表示范圍的區間

????????比如:[0123456789]-->[0-9]

????????[0-9][0-9][0-9][0-9][0-9][0-9]

????????[a-z]-->1位小寫字母

????????[A-Z]-->1位大寫字母

????????[A-Za-z]-->1位字母,大小寫都行

????????[0-9a-zA-Z]-->1位字母或數字都行

?????反選:[^不能選的字符列表]

?????比如:[^47]?強調:^作“除了”使用時,只能放在開頭

2.?預定義字符集:為常用的字符集專門提供的簡化寫法!

????“\d”-->[0-9]-->1位數字

????“\w”-->[0-9a-zA-Z_]-->1位字母,數字或_

????“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。

?“?. “:?除換行回車外的任何一個字符,如:

"a.[0-9]":表示一個字符串有一個"a"后面跟著一個任意字符和一個數字;
"^.{3}$":表示有任意三個字符的字符串(長度為3個字符)

\t--------匹配一個制表符???

????預定義字符的反義:預定義字符的大寫形式都是小寫的反義

????\D---->1位非數字字符

\S------匹配任何非空白字符。等價于 [^\f\n\r\t\v]。

\v------匹配一個垂直制表符

\n------匹配一個換行符

\r-------匹配一個回車符

?3.?數量詞:規定相鄰的字符集可出現的次數

? 確定數量:3種:

{n}-->?必須反復出現n位

???????????{n,m}-->?最少出現n次,最多出現m次

???????????{n,}-->至少出現n次,多了不限!

??????比如:/^\d{6}$/——6位數字

??????手機號規則:

????????第1位:只能是1

????????第2位:[34578]

????????第3位之后,必須是9位數字

??????手機號:/^1[34578]\d{9}$/

?不確定數量:3種:

????????*:?有沒有都行,次數不限,相當于{0,}

????????+:?至少1次,重復次數不限,相當于{1,}

?????????:?有沒有都行,最多1次,相當于{0,1}

????????():分組

????????|:?左右兩正則表達式選其一

??????身份證號邏輯:

????????前15位數字

????????16,17位必須是數字

????????最后一位可以是數字或X x

????????后三位 可有可無,如果有,只能出現一次

??????\d{15}(\d\d[0-9Xx])?

?

??????手機號:

????????手機號前可能出現+86或0086。

????????前綴可有可無,且只能出現一次

????????前綴和手機號之間可以有或沒有任意個空字符?

  ??第1位:只能是1

????????第2位:[34578]

????????第3位之后,必須是9位數字

??????手機號:

??????(\+86|0086)?\s*1[34578]\d{9}

????

4.?指定匹配位置

??????^表達式:?必須以表達式的規則為開頭

??????表達式$:?必須以表達式的規則為結尾

?????比如:選擇字符串開頭的空格?^\s*

???????????選擇結尾空格?\s*$

???????????選擇開頭或結尾的空格?^\s*|\s*$

?????*預告:今后只要在程序中執行驗證:都要前加^后加$*

????????????表示從頭到尾完整匹配。

?????比如:test():

???????^\d{6}$——從頭到尾必須只能是6位數字

???????1234567

5.?預判:在正式匹配正則表達式之前,先預讀整個字符串,進行初步匹配,如果預判都未通過,則不再驗證!

?1)(?=表達式):?先瀏覽字符串是否滿足表達式的要求

??????何時使用:只要正則中出現類似"而且"

??????比如:4位數字,但不能包含4和7

??????(?=[^47]$)?是否由除了4,7之外的字符組成

?2)(?!表達式):先檢查字符串是否不滿足表達式要求

   比如:6位以上密碼。

???字母,數字組成

???????????首字母不能是數字: [a-zA-Z][a-zA-Z0-9]{5,}

???????????必須至少包含1個大寫字母

???????????不能都由小寫字母和數字組成: (?![a-z0-9]+$)

???????????必須至少包含1個數字

???????????不能都由小寫字母和大寫字母組成:

??????????? (?![a-zA-Z]+$)

6.特殊字符

  所謂特殊字符,就是一些有特殊含義的字符,如"*.txt"中的*,簡單的說就是表示任何字符串的意思。如果要查找文件名中有*的文件,則需要對*進行轉義,即在其前加一個\。ls \*.txt。許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜杠字符 (\) 放在它們前面。下面列出了正則表達式中的特殊字符:(請注意在方括號中,不需要轉義字符。)

“$”------匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。

“()”----標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。

“*”----匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \*。

“+”-----匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+。

“.”----匹配除換行符 \n之外的任何單字符。要匹配 .,請使用 \.。

“[”------標記一個中括號表達式的開始。要匹配 [,請使用 \[。

“?”----匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。

“\”----將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "(".

“^”-----匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^。

“{”----標記限定符表達式的開始。要匹配 {,請使用 \{。

“|”----指明兩項之間的一個選擇。要匹配 |,請使用 \|。

7.?貪婪模式和懶惰模式

???貪婪模式:默認情況下,正則表達式會匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現非貪婪或最小匹配。

???貪婪模式原因:(.*) (.+)

???懶惰模式:正則表達式僅匹配最小的符合規則的字符串

???比如:篩選網頁中的a元素:

??????<a\s+(.*)href\s*=\s*["']([^'"]*)["']

???貪婪模式-->懶惰模式:.*? ??

例如:

您可能搜索?HTML?文檔,以查找括在?H1?標記內的章節標題。該文本在您的文檔中如下:

<h1> Chapter 1 - Introduction to Regular Expression</h1>

下面的表達式匹配從開始小于符號?(<)?到關閉?H1?標記的大于符號?(>)?之間的所有內容。

/<.*>/

如果您只需要匹配開始?H1?標記,下面的"非貪心"表達式只匹配?<H1>。

/<.*?>/

通過在?*、+?或???限定符之后放置??,該表達式從"貪心"表達式轉換為"非貪心"表達式或者最小匹配。

?

三、常用正則表達式示例及說明:

1.正則表達式驗證控制文本框的輸入字符類型

1)只能輸入數字和英文的:?

<input οnkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text1" NAME="Text1">

2)只能輸入數字的:

<input οnkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text2" NAME="Text2">

3)只能輸入全角的:?

<input οnkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" ID="Text3" NAME="Text3">

4)只能輸入漢字的:?

<input οnkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" ID="Text4" NAME="Text4">

2.正則表達式的應用實例通俗說明

*******************************************************************************

//校驗是否全由數字組成

/^[0-9]{1,20}$/

^ 表示打頭的字符要匹配緊跟^后面的規則

$ 表示打頭的字符要匹配緊靠$前面的規則

[ ] 中的內容是可選字符集

[0-9] 表示要求字符范圍在0-9之間

{1,20}表示數字字符串長度合法為1到20,即為[0-9]中的字符出現次數的范圍是1到20次。
/^ 和 $/成對使用應該是表示要求整個字符串完全匹配定義的規則,而不是只匹配字符串中的一個子串。
*******************************************************************************

//校驗登錄名:只能輸入5-20個以字母開頭、可帶數字、“_”、“.”的字串

/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/

^[a-zA-Z]{1} 表示第一個字符要求是字母。

([a-zA-Z0-9]|[._]){4,19} 表示從第二位開始(因為它緊跟在上個表達式后面)的一個長度為4到9位的字符串,它要求是由大小寫字母、數字或者特殊字符集[._]組成。

*******************************************************************************

//校驗用戶姓名:只能輸入1-30個以字母開頭的字串

/^[a-zA-Z]{1,30}$/

*******************************************************************************

//校驗密碼:只能輸入6-20個字母、數字、下劃線

/^(\w){6,20}$/

\w:用于匹配字母,數字或下劃線字符

*******************************************************************************

//校驗普通電話、傳真號碼:可以“+”或數字開頭,可含有“-” 和 “ ”

/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/

\d:用于匹配從0到9的數字;

“?”元字符規定其前導對象必須在目標對象中連續出現零次或一次

可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等

*******************************************************************************

//校驗URL

/^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的長度為length(“https://”) + n )

\ / :表示字符“/”。

. 表示所有字符的集

+ 等同于{1,},就是1到正無窮吧。

*************************************************************************

三、RegExp?對象和方法

在Javascript中,通過RegExp對象來支持正則表達式。創建正則表達式的方式有兩種:

1.最簡單的創建正則表達式的方法:字面量形式

Var expression=/pattern/flags

其中pattern部分可以使任何簡單的正則表達式

Flags表示正則表達式的標志,正則表達式的匹配模式支持3個標志:

1)”g”:表示全局(globle)模式,即模式被應用于所有字符串,而非在發現第一個匹配項是立即停止。

2)“i”:表示不區分大小寫模式,即在確定匹配項是忽略模式于字符串的大小寫。

3)“m”:表示多行模式,即在到達一行文本末尾是還會繼續查找下一行中是否存在與模式匹配的項。例如:

/*匹配字符串中所有”at”的實例*/

Var paatern1=/at/g;

/*匹配第一個”bat”或”cat”,不區分大小寫*/

Var paatern2=/[bc]at/i;

/*匹配所有以”at”結尾的3個字符串的組合,不區分大小寫*/

Var paatern2=/.at/gi;

2.使用RegExp構造函數創建正則表達式

Var expression=new Regexp([bc]at,i);

其中傳給RegExp構造函數的兩個參數都是字符串(不能把正則表達式的字面量傳遞給RegExp構造函數),也因此,在某些情況下要對字符進行雙重轉義。所有的元字符都必須進行雙重轉義。例如:

字面量模式:

/\[bc\]at/ ??/\.at/ ??/name\/age/ ??/\d.\d{1,2}/ ?/\w\\hello\\123/

等價的字符串形式:

“\\[bc\\]at”??“\\.at”??“name\\/age”??“\\d.\\d{1,2}”???“\\w\\\\hello\\\\123”

注意:使用正則表達式字面量和使用RegExp構造函數創建的正則表達式不一樣,正則表達式字面量始終會共享同一個RegExp實例,而構造函數創建的每一個新RegExp實例都是一個新實例(動態創建的)。

3.Exec()?查找方法

Exec()接受一個參數,即要應用模式的字符串,然后返回包含第一個匹配項的信息的數組,如果沒有找到則返回null。返回的數組包含兩個屬性:index和input,index表示匹配項在字符串中的位置,input表示應用正則表達式的字符串。

對于exec()而言即使在模式中設置了全局模式(g),它每次也只會返回一個匹配項,但是如果設置了全局模式,每次調用它都會返回字符串中的下一個匹配項,知道搜索到字符串的末尾為止。所以自全局匹配模式下,lastIndex的值在每次調用exec()后,都會增加,所以要想獲取所有的匹配項內容和下標,需要循環獲取。而在非全局模式下lastIndex則始終不變。

4.test()驗證方法

此方法要求驗證的字符串和正則表達式從頭到尾完全匹配,需要”^”和”$”符號。

Reg.test(str):?如果匹配,返回true,否則返回false。Test()方法經常被用在if語句中,經常被用在驗證用戶輸入的情況下,驗證用戶輸入是不是有效。

例如:

Var text=”000-00-0000”;

Var pattern=/\d{3}-\d{2}-\d{4}/;

If(pattern.test(text)){

Atert(“the pattern was matched”);

}

原地址https://www.cnblogs.com/mingxiastory/p/5426913.html

轉載于:https://www.cnblogs.com/mlban/p/8405176.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539469.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring tx:advice/

<tx:advice/> 有關的設置 這一節里將描述通過 <tx:advice/> 標簽來指定不同的事務性設置。默認的 <tx:advice/> 設置如下&#xff1a; 事務傳播設置是 REQUIRED 隔離級別是 DEFAULT 事務是 讀/寫 事務超時默認是依賴于事務系統的&#xff0c;或者事務超…

drcom linux怎么運行,linux下使用drcom登錄認證

下載首先感謝開發者:https://github.com/drcoms/drcom-generic這個項目基于python實現了d,p,x版drcom認證,請到上述鏈接查看相關信息,項目的wiki簡單介紹了各版本的使用方法.首先下載上面的drcom-generic,我將其下載到了家目錄~/下,完整目錄:~/drcom-generic取得必要信息下面啟…

升級瀏覽器_星愿瀏覽器升級至6.3.2000.2001

玩懂手機網資訊&#xff0c;星愿瀏覽器升級至6.3.2000.2001&#xff0c;可能很多玩友都不熟悉這款瀏覽器&#xff0c;星愿瀏覽器(Twinkstar Browser)是一款使用chromium內核來自一首英文歌曲《 Twinkle, twinkle, little star》&#xff0c;選twinkle的名詞twink&#xff0c;組…

js定時刷新時間

<p id"currentTime"> </p><script> document.getElementById("currentTime").innerHTML new Date();//初始化時間 var timing setInterval(function(){changeTime()},1000);//設置定時執行方法和執行頻率 function changeTime(){ docu…

mybatis3 添加ehcache支持

為了提高MyBatis的性能,有時候我們需要加入緩存支持,目前用的比較多的緩存莫過于ehcache緩存了,ehcache性能強大,而且位各種應用都提供了解決方案,在此我們主要是做查詢緩存,提高查詢的效率. 在Mybatis的官網上把集成ehcache的文檔下載下來看了看,說的太簡單了,對于新手很難理解…

linux下延時1ms用什么函數,Linux下1ms分辨率定時器推薦方式

我需要一個在Linux下具有1ms分辨率的計時器刻度。它用于遞增計時器值&#xff0c;該計時器值又用于查看是否應觸發各種事件。由于glibc的要求&#xff0c;POSIXtimerfd_create不是一個選項。我嘗試使用timer_create和timer_settimer&#xff0c;但從它們獲得的最好結果是10ms分…

添加自定義監控項目,配置郵件告警,測試告警,不發郵件的問題處理

2019獨角獸企業重金招聘Python工程師標準>>> 添加自定義監控項目 需求&#xff1a;監控某臺web的80端口連接數&#xff0c;并出圖兩步&#xff1a;1&#xff09;zabbix監控中心創建監控項目&#xff1b;2&#xff09;針對該監控項目以圖形展現對于第一步&#xff0c…

高通驍龍cpu排行_驍龍系列處理器性能分析,你的手機是什么處理器?

首先來看下目前使用比較多的驍龍處理器排行毫無疑問8系列最新出的驍龍855 Plus性能最強&#xff0c;剛剛發布的vivo NEX 3 5G版搭載的就是這款處理器。那么到底855和855 Plus有什么區別呢&#xff1f;一張圖告訴大家從表格可以看出來&#xff0c;驍龍855和驍龍855CPU采用的都是…

Spring配置項context:annotation-config/解釋說明

在基于主機方式配置Spring的配置文件中&#xff0c;你可能會見到<context:annotation-config/>這樣一條配置&#xff0c;他的作用是式地向 Spring 容器注冊 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPost…

linux服務器插上硬盤不能開機,Linux服務器添加新硬盤無法識別解決方法(無需重啟)...

Linux服務器添加新硬盤無法識別解決方法(無需重啟)發布時間&#xff1a;2018-08-24 19:45,瀏覽次數&#xff1a;711, 標簽&#xff1a;Linux前言一般來說&#xff0c;當我們在服務上插入新的磁盤時&#xff0c;服務器是會對磁盤進行識別的。但是&#xff0c;有的時候服務器并沒…

服務器cpu_服務器CPU與GPU協同運算加速三巨頭競爭

來源&#xff1a;內容來自「MoneyDJ」&#xff0c;謝謝。根據DIGITIMES Research分析師翁書婷觀察&#xff0c;高速運算需求下&#xff0c;服務器CPU與GPU協同運算趨勢將加速NVLink、CCIX(Cache Coherent Interconnect for Accelerators)、CXL(Compute Express Link)與Gen-Z等開…

平面分割問題

同一個平面內有n&#xff08;n<500&#xff09;條直線&#xff0c;已知其中p&#xff08;n>p>2&#xff09;條直線相交于同一點。則這n條直線最多能將平面分割成多少個不同的區域&#xff1f; 分析&#xff1a;觀察發現原有的p條線把平面分為2p個區域。為了能夠劃分出…

myeclipse去掉js報錯

選中報錯的js文件&#xff0c; 右鍵選擇 MyEclipse-->Exclude From Validation &#xff1b; 然后繼續右鍵執行MyEclipse-->Run Validation 即可

linux系統高級管理工具包,linux兩大系統的包管理工具

linux系統分為兩大陣營&#xff1a;1. redhat系統&#xff1a;包括Redhat、Centos、Fedora等2. debian系統&#xff1a;包括Debian、Ubuntu等RedHat 系列1 常見的安裝包格式 rpm包,安裝rpm包的命令是“rpm -參數”2 包管理工具 yum3 支持tar包Debian系列1 常見的安裝包格式 deb…

python繼承

為什么80%的碼農都做不了架構師&#xff1f;>>> #繼承 #衍生的類&#xff08;子類&#xff09;繼承父類的方法和數據成員 #語法&#xff1a; # class 子類&#xff1a;父類 # {......} #子類繼承父類&#xff0c;父類派生子類。父類又叫基類&#xff0c;子類又叫派生…

cpu散熱器怎么拆_電腦CPU處理器與整機溫度高 教你簡單解決

炎炎夏日&#xff0c;電腦卡、慢、死機、關機多數是中央處理器(以下簡稱CPU)溫度過高引起的。如果有上述感覺&#xff0c;那么你很可能就是這個病癥。第一步、需要確定真正是否為溫度高的問題&#xff0c;先不要著急拆機&#xff0c;軟件測試&#xff0c;一般用百度搜索《魯大師…

MyEclipse里運行Tomcat后,Console窗口里中文顯示亂碼

windows-preferences-搜索tomcat 修改為 UTF-8 或 gbk

linux查看raid情況工具,使用MegaCli工具查看Raid磁盤陣列狀態

轉載自&#xff1a;http://home.51.com/chenjianghui1987/diary/item/10051836.html文章本身我不做過多修改了&#xff0c;在這里我就把自己在安裝時候碰到的難點跟大家提下。1.何處下載&#xff1f;首先&#xff0c;根據文章中的路徑已經下載不到相應的文件了&#xff0c;在此…

Myeclipse 更改web項目的訪問名

第一步&#xff1a;在要修改的項目名稱上右擊選擇最下面一列的”prepertise“&#xff08;屬性&#xff09;&#xff0c;進入屬性設置界面。 第二步&#xff1a;找到左側菜單欄的”Myeclipse“中的web項&#xff0c;設置”Web Context -root“值&#xff0c;之后點擊”ok“按鈕…

年底送書活動:送出6本技術書籍,價值372元!

年底了 為了回饋公眾號粉絲 特別贈送6本新書 它就是&#xff01;&#xff01;&#xff01; <RabbitMQ實戰指南> 最近在做消息隊列 正好看到此書 收益良多 正好推薦給大家 感謝原書作者支持3本 另外~ 本人自費購買了3本 一共6本 免費送給大家 總價值&#xff1a;62*6&…