整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          「編程思維」JavaScript正則表達式的深度解析

          avaScript正則表達式的深度解析與應用

          **一、正則表達式的魅力**

          正則表達式,簡稱Regex,是一種強大的字符串處理工具,它能幫助我們快速、準確地匹配、查找、替換復雜的字符串模式。在JavaScript中,正則表達式被賦予了更高的地位,它不僅僅是一個工具,更是一種編程思維。

          正則表達式的主要應用場景包括但不限于:表單驗證、文本內容過濾、敏感詞替換、字符串的特定部分提取等。

          **二、正則表達式的創建與使用**

          在JavaScript中,創建正則表達式有兩種方式:

          1. **通過RegExp構造函數**:`var regex = new RegExp('pattern');`

          2. **通過字面量方式**:`var regex = /pattern/;`

          一旦創建了正則表達式,就可以使用其提供的`test()`方法來檢測字符串是否符合該正則表達式的規則。

          **三、正則表達式的核心元素**

          正則表達式的強大之處在于其包含的各種特殊字符和元字符,它們賦予了正則表達式豐富的匹配能力。

          1. **邊界符**:`^` 和 `$` 分別表示字符串的開始和結束。

          2. **字符類**:`[]` 用于定義一組可選的字符,如`[abc]`表示匹配`a`、`b`或`c`中的任何一個字符。

          3. **量詞符**:如`*`、`+`、`?`、`{n}`、`{n,}`和`{n,m}`,它們用于指定字符或字符組出現的次數。

          4. **預定義類**:如`\d`、`\D`、`\w`、`\W`、`\s`和`\S`,它們提供了對常見字符模式的快速匹配。

          **四、正則表達式的替換功能**

          正則表達式的另一個強大功能是替換。使用`replace()`方法,可以基于正則表達式匹配到的內容,將字符串中的特定部分替換為其他內容。

          `replace()`方法接受兩個參數:第一個參數是要被替換的模式(可以是字符串或正則表達式),第二個參數是替換后的內容。

          **五、正則表達式的修飾符**

          正則表達式還支持一些修飾符,它們可以改變匹配的行為:

          * `g`:全局匹配,即匹配整個字符串中的所有符合條件的內容,而不僅僅是第一個。

          * `i`:忽略大小寫,即在匹配時忽略字符的大小寫。

          結合使用這兩個修飾符,如`gi`,可以實現全局且不區分大小寫的匹配。

          **六、總結**

          正則表達式是JavaScript中一個非常強大的工具,它可以幫助我們高效地處理字符串,實現復雜的匹配、查找和替換操作。掌握正則表達式的核心概念和用法,對于提升JavaScript編程能力具有非常重要的意義。

          文目標

          30分鐘內讓你明白正則表達式是什么,并對它有一些基本的了解,讓你可以在自己的程序或網頁里使用它

          正則表達式到底是什么東西?

          字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等等。字符串是0個或更多個字符的序列。文本也就是文字,字符串。說某個字符串匹配某個正則表達式,通常是指這個字符串里有一部分(或幾部分分別)能滿足表達式給出的條件。

          在編寫處理字符串的程序或網頁時,經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。

          很可能你使用過Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某個目錄下的所有的Word文檔的話,你會搜索*.doc。在這里,*會被解釋成任意的字符串。和通配符類似,正則表達式也是用來進行文本匹配的工具,只不過比起通配符,它能更精確地描述你的需求——當然,代價就是更復雜——比如你可以編寫一個正則表達式,用來查找所有以0開頭,后面跟著2-3個數字,然后是一個連字號“-”,最后是7或8位數字的字符串(像010-12345678或0376-7654321)。

          入門

          學習正則表達式的最好方法是從例子開始,理解例子之后再自己對例子進行修改,實驗。下面給出了不少簡單的例子,并對它們作了詳細的說明。

          假設你在一篇英文小說里查找hi,你可以使用正則表達式hi。

          這幾乎是最簡單的正則表達式了,它可以精確匹配這樣的字符串:由兩個字符組成,前一個字符是h,后一個是i。通常,處理正則表達式的工具會提供一個忽略大小寫的選項,如果選中了這個選項,它可以匹配hi,HI,Hi,hI這四種情況中的任意一種。

          不幸的是,很多單詞里包含hi這兩個連續的字符,比如him,history,high等等。用hi來查找的話,這里邊的hi也會被找出來。如果要精確地查找hi這個單詞的話,我們應該使用\bhi\b。

          \b是正則表達式規定的一個特殊代碼(好吧,某些人叫它元字符,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b并不匹配這些單詞分隔字符中的任何一個,它只匹配一個位置

          如果需要更精確的說法,\b匹配這樣的位置:它的前一個字符和后一個字符不全是(一個是,一個不是或不存在)\w。

          假如你要找的是hi后面不遠處跟著一個Lucy,你應該用\bhi\b.*\bLucy\b。

          這里,.是另一個元字符,匹配除了換行符以外的任意字符。*同樣是元字符,不過它代表的不是字符,也不是位置,而是數量——它指定*前邊的內容可以連續重復使用任意次以使整個表達式得到匹配。因此,.*連在一起就意味著任意數量的不包含換行的字符。現在\bhi\b.*\bLucy\b的意思就很明顯了:先是一個單詞hi,然后是任意個任意字符(但不能是換行),最后是Lucy這個單詞。

          換行符就是'\n',ASCII編碼為10(十六進制0x0A)的字符。

          如果同時使用其它元字符,我們就能構造出功能更強大的正則表達式。比如下面這個例子:

          0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字符串:以0開頭,然后是兩個數字,然后是一個連字號“-”,最后是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。

          這里的\d是個新的元字符,匹配一位數字(0,或1,或2,或……)。-不是元字符,只匹配它本身——連字符(或者減號,或者中橫線,或者隨你怎么稱呼它)。

          為了避免那么多煩人的重復,我們也可以這樣寫這個表達式:0\d{2}-\d{8}。這里\d后面的{2}({8})的意思是前面\d必須連續重復匹配2次(8次)。

          測試正則表達式

          如果你不覺得正則表達式很難讀寫的話,要么你是一個天才,要么,你不是地球人。正則表達式的語法很令人頭疼,即使對經常使用它的人來說也是如此。由于難于讀寫,容易出錯,所以找一種工具對正則表達式進行測試是很有必要的。

          不同的環境下正則表達式的一些細節是不相同的,本教程介紹的是微軟 .Net Framework 4.5 下正則表達式的行為,所以,我向你推薦我編寫的.Net下的工具 Regester。請參考該頁面的說明來安裝和運行該軟件。

          元字符

          現在你已經知道幾個很有用的元字符了,如\b,.,*,還有\d.正則表達式里還有更多的元字符,

          下面來看看更多的例子:

          \ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然后是字母a,然后是任意數量的字母或數字(\w*),最后是單詞結束處(\b)。

          \d+匹配1個或更多連續的數字。這里的+是和*類似的元字符,不同的是*匹配重復任意次(可能是0次),而+則匹配重復1次或更多次。

          \b\w{6}\b 匹配剛好6個字符的單詞。

          常用的元字符

          .匹配除換行符以外的任意字符

          \w匹配字母或數字或下劃線或漢字

          \s匹配任意的空白符

          \d匹配數字

          \b匹配單詞的開始或結束

          ^匹配字符串的開始$匹配字符串的結束

          元字符^(和數字6在同一個鍵位上的符號)和$都匹配一個位置,這和\b有點類似。^匹配你要用來查找的字符串的開頭,$匹配結尾。這兩個代碼在驗證輸入的內容時非常有用,比如一個網站如果要求你填寫的QQ號必須為5位到12位數字時,可以使用:^\d{5,12}$。

          這里的{5,12}和前面介紹過的{2}是類似的,只不過{2}匹配只能不多不少重復2次,{5,12}則是重復的次數不能少于5次,不能多于12次,否則都不匹配。

          因為使用了^和$,所以輸入的整個字符串都要用來和\d{5,12}來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的QQ號能匹配這個正則表達式的話,那就符合要求了。

          和忽略大小寫的選項類似,有些正則表達式處理工具還有一個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。

          字符轉義

          如果你想查找元字符本身的話,比如你查找.,或者*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字符的特殊意義。因此,你應該使用\.和\*。當然,要查找\本身,你也得用\.

          例如:deerchao\.net匹配deerchao.net,C:\Windows匹配C:\Windows。

          重復

          你已經看過了前面的*, +, {2}, {5,12}這幾個匹配重復的方式了。下面是正則表達式中所有的限定符(指定數量的代碼,例如*, {5,12}等):

          常用的限定符

          *重復零次或更多次

          +重復一次或更多次

          ?重復零次或一次

          {n}重復n次

          {n,}重復n次或更多次

          {n,m}重復n到m次

          下面是一些使用重復的例子:

          Windows\d+匹配Windows后面跟1個或更多數字

          ^\w+匹配一行的第一個單詞(或整個字符串的第一個單詞,具體匹配哪個意思得看選項設置)

          字符類

          要想查找數字,字母或數字,空白是很簡單的,因為已經有了對應這些字符集合的元字符,但是如果你想匹配沒有預定義元字符的字符集合(比如元音字母a,e,i,o,u),應該怎么辦?

          很簡單,你只需要在方括號里列出它們就行了,像[aeiou]就匹配任何一個英文元音字母,[.?!]匹配標點符號(.或?或!)。

          我們也可以輕松地指定一個字符范圍,像[0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考慮英文的話)。

          下面是一個更復雜的表達式:\(?0\d{2}[) -]?\d{8}。

          這個表達式可以匹配幾種格式的電話號碼,像(010)88886666,或022-22334455,或02912345678等。

          我們對它進行一些分析吧:

          • 首先是一個轉義字符\(,它能出現0次或1次(?)
          • 然后是一個0,后面跟著2個數字(\d{2})
          • 然后是)或-或空格中的一個,它出現1次或不出現(?)
          • 最后是8個數字(\d{8})。

          分枝條件

          不幸的是,剛才那個表達式也能匹配010)12345678或(022-87654321這樣的“不正確”的格式。要解決這個問題,我們需要用到分枝條件。正則表達式里的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。聽不明白?沒關系,看例子:

          0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。

          \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}這個表達式匹配3位區號的電話號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表達式擴展成也支持4位區號的。

          \d{5}-\d{4}|\d{5}這個表達式用于匹配美國的郵政編碼。美國郵編的規則是5位數字,或者用連字號間隔的9位數字。之所以要給出這個例子是因為它能說明一個問題:使用分枝條件時,要注意各個條件的順序。如果你把它改成\d{5}|\d{5}-\d{4}的話,那么就只會匹配5位的郵編(以及9位郵編的前5位)。原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。

          分組

          我們已經提到了怎么重復單個字符(直接在字符后面加上限定符就行了);但如果想要重復多個字符又該怎么辦?你可以用小括號來指定子表達式(也叫做分組),然后你就可以指定這個子表達式的重復次數了,你也可以對子表達式進行其它一些操作(后面會有介紹)。

          (\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配表達式。要理解這個表達式,請按下列順序分析它:\d{1,3}匹配1到3位的數字,(\d{1,3}\.){3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(\d{1,3})。

          不幸的是,它也將匹配256.300.888.999這種不可能存在的IP地址。如果能使用算術比較的話,或許能簡單地解決這個問題,但是正則表達式中并不提供關于數學的任何功能,所以只能使用冗長的分組,選擇,字符類來描述一個正確的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

          理解這個表達式的關鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?,這里我就不細說了,你自己應該能分析得出來它的意義。

          反義

          有時需要查找不屬于某個能簡單定義的字符類的字符。比如想查找除了數字以外,其它任意字符都行的情況,這時需要用到反義:

          常用的反義代碼

          \W匹配任意不是字母,數字,下劃線,漢字的字符

          \S匹配任意不是空白符的字符

          \D匹配任意非數字的字符

          \B匹配不是單詞開頭或結束的位置

          [^x]匹配除了x以外的任意字符

          [^aeiou]匹配除了aeiou這幾個字母以外的任意字符

          例子:

          \S+匹配不包含空白符的字符串。

          <a[^>]+>匹配用尖括號括起來的以a開頭的字符串。

          后向引用

          使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。

          后向引用用于重復搜索前面某個分組匹配的文本。例如,代表分組1匹配的文本。難以理解?請看示例:

          \b(\w+)\b\s+\b可以用來匹配重復的單詞,像go go, 或者kitty kitty。這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中,然后是1個或幾個空白符(\s+),最后是分組1中捕獲的內容(也就是前面匹配的那個單詞)()。

          你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個分組捕獲的內容,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。

          使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:

          常用分組語法

          我們已經討論了前兩種語法。第三個(?:exp)不會改變正則表達式的處理方式,只是這樣的組匹配的內容不會像前兩種那樣被捕獲到某個組里面,也不會擁有組號。“我為什么會想要這樣做?”——好問題,你覺得為什么呢?

          零寬斷言

          接下來的四個用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:

          (?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的后面能匹配表達式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。

          (?<=exp)也叫零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

          假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=\d)\d{3})+\b,用它對1234567890進行查找時結果是234567890。

          下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

          負向零寬斷言

          前面我們提到過怎么查找不是某個字符或不在某個字符類里的字符的方法(反義)。但是如果我們只是想要確保某個字符沒有出現,但并不想去匹配它時怎么辦?例如,如果我們想查找這樣的單詞--它里面出現了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣:

          \b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像Iraq,Benq,這個表達式就會出錯。這是因為[^u]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的[^u]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的\w*\b將會匹配下一個單詞,于是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。現在,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。

          零寬度負預測先行斷言(?!exp),斷言此位置的后面不能匹配表達式exp。例如:\d{3}(?!\d)匹配三位數字,而且這三位數字的后面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字符串abc的單詞。

          同理,我們可以用(?<!exp),零寬度負回顧后發斷言來斷言此位置的前面不能匹配表達式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字。

          一個更復雜的例子:(?<=<(\w+)>).*(?=<\/>)匹配不包含屬性的簡單HTML標簽內里的內容。(?<=<(\w+)>)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是<b>),然后是.*(任意的字符串),最后是一個后綴(?=<\/>)。注意后綴里的\/,它用到了前面提過的字符轉義;則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果前綴實際上是<b>的話,后綴就是</b>了。整個表達式匹配的是<b>和</b>之間的內容(再次提醒,不包括前綴和后綴本身)。

          注釋

          小括號的另一種用途是通過語法(?#comment)來包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。

          要包含注釋的話,最好是啟用“忽略模式里的空白符”選項,這樣在編寫表達式時能任意的添加空格,Tab,換行,而實際使用時這些都將被忽略。啟用這個選項后,在#后面到這一行結束的所有文本都將被當成注釋忽略掉。例如,我們可以前面的一個表達式寫成這樣:

           (?<= # 斷言要匹配的文本的前綴
           <(\w+)> # 查找尖括號括起來的字母或數字(即HTML/XML標簽)
           ) # 前綴結束
           .* # 匹配任意文本
           (?= # 斷言要匹配的文本的后綴
           <\/\1> # 查找尖括號括起來的內容:前面是一個"/",后面是先前捕獲的標簽
           ) # 后綴結束
          

          貪婪與懶惰

          當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。

          有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味著匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。現在看看懶惰版的例子吧:

          a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用于aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。

          處理選項

          上面介紹了幾個選項如忽略大小寫,處理多行等,這些選項能用來改變處理正則表達式的方式。下面是.Net中常用的正則表達式選項:

          一個經常被問到的問題是:是不是只能同時使用多行模式和單行模式中的一種?答案是:不是。這兩個選項之間沒有任何關系,除了它們的名字比較相似(以至于讓人感到疑惑)以外。事實上,為了避免混淆,在最新的 JavaScript 中,單行模式其實名叫 dotAll,意為點可以匹配所有字符,然而在指定該選項時,用的還是 Singleline 的首字母 s.

          ***為什么要使用正則表達式****

          正則表達式通過由普通字符和特殊字符組成的文字模板完成對字符串的校驗,搜索,替換。在javascript中類似這樣

          /^1\d{10}$/

          上面的這個簡單的正則用來匹配手機號

          至于說正則表達式到底有什么意義,借由《精通正則表達式》里面的一句話來概括好了。

          “如果羅列計算機軟件領域的偉大發明,我相信絕對不會超過二十項,在這個名單當中,當然應該包括分組交換網絡,Web,Lisp,哈希算法,UNIX,編譯技術,關系模型,面向對象,XML這些大名鼎鼎的家伙,而正則表達式也絕對不應該被漏掉。

          對很多實際工作而言,正則表達式簡直是靈丹妙藥,能夠成百倍的提高開發效率和程序質量。”

          ****正則表達式的生成****

          在javascript中生成正則表達式的方式有兩種

          調用RegExp對象的構造函數

          var reg = new RegExp('^[a-z] [0-9][align=left][font=微軟雅黑][size=3][color=#000000][backcolor=white]其中第一個參數是匹配模式,第二個參數是可選參數(g, i, m),分別用于指定全局匹配、區分大小寫的匹配和多行匹配。這種方式會在正則表達式運行時編譯(runtime compilation)。如果你知道正則表達式模式將會改變,或者你事先不知道什么模式,而是從另一個來源獲取,如用戶輸入,這些情況都可以使用構造函數。[/backcolor][/color][/size][/font][/align]

          [*][align=left][font=微軟雅黑][size=3][color=#000000][backcolor=white]使用正則表達式字面值,將匹配模式封閉在兩個斜杠中[/backcolor][/color][/size][/font][/align][code]var reg = /^[a-z] [0-9]$/gi

          當表達式被賦值時,字面量形式提供正則表達式的編譯(compilation),當正則表達式保持為常量時一般使用字面量方式。例如當你在循環中使用字面量構造一個正則表達式時,正則表達式不會在每一次迭代中都被重新編譯(recompiled)

          ****正則表達式的組成****

          正則表達式的文字模板是有很多不同類型的字符組成的,包括:

          元字符,轉義字符,限定符,字符組,或結構,括號分組

          元字符

          字符

          含義

          .匹配除了換行符(n)以外的所有字符

          w匹配字母,數字,或者漢字

          W匹配除了字母,數字,漢字以外的其他字符

          d匹配數字

          D匹配除了數字以外的其他字符

          s匹配任意的空白符(f, n, r, t, v)

          S匹配空白符以外的任意字符

          b匹配單詞的開始或者結束

          B匹配單詞的非開始或者結束

          ^匹配行首

          $匹配行尾

          ****轉義字符****

          * ? | { [ ( ) ] }^ $ . # 和 空白 這些字符都是需要轉義的。例如我們要匹配{。

          \{

          限定符

          字符

          含義

          *匹配零次至多次

          匹配一次至多次

          ?匹配零次或一次

          {2,}至少匹配兩次

          {10}匹配10次

          {{2, 8}}至少匹配兩次之多匹配八次

          字符組[]

          中括號字符組用來匹配括號內的字符之一

          'fasfagxfasdfyfasfz'.split(/[xyz]/) //["fasfag", "fasdf", "fasf", ""]

          還有一種排除性字符組

          'xaxbycz'.split(/[^xyz]/) //["x", "x", "y", "z"]

          或結構 |

          例如c|d匹配或者d

          /c|d/.test('af') // false

          /c|d/.test('ad') // true

          ****括號分組****

          (cd){1,} 可以匹配cdcd..等, 其中cd便是一個分組。

          /(cd){1,}$/.test('cdcd') //true

          ****貪婪模式和非貪婪模式****

          默認情況下,所有的限定詞都是貪婪模式,表示盡可能多的去捕獲字符。而在限定詞后增加“?”,則是非貪婪模式,表示盡可能少的去捕獲字符。

          'ccccccd'.match(/c /) //["ccccc"], 貪婪模式, 捕獲所有

          'ccccccd'.match(/c ?/) //["c"], 非貪婪模式, 只捕獲到第一

          ****捕獲分組****

          在實際應用中我們很有可能需要獲取到匹配的字符串,例如我們要將字符串"萬里碧空飄著朵朵白云"替換成"萬里碧空沒有一朵白云"

          "萬里碧空飄著朵朵白云".replace(/(萬里碧空)飄著朵朵白云/, '沒有一朵白云')

          捕獲性分組會創建反向引用,js中可以通過 $ number 或者 "反斜杠" number" 表示法進行引用。

          注意:

          反斜杠 number這種引用可以在正則表達式中使用,可用于匹配不同位置的相同子串,例如:

          'www.bai.bai.com'.replace(/([a-z] )\./, '') // www.bai.com

          ****非捕獲性分組****

          非捕獲性分組,通常由一對括號加上”?:”加上子表達式組成,非捕獲性分組不會創建反向引用,就好像沒有括號一樣。捕獲性分組和無捕獲性分組在搜索效率方面也沒什么不同,沒有哪一個比另一個更快。

          /^(?:\d )/

          ****正則表達式的方法****

          test

          檢索字符串中的指定子串,返回布爾值

          /^\d[a-zA-Z]{3}$/.test('1aac') // true

          exec

          返回一個數組,數組中的第一個條目是第一個匹配

          /^\d[a-zA-Z]{3}$/.exec('1aac') // ["1aac"]

          String可以使用正則表達式的方法

          search

          返回子串的開始位置

          'a12b2334c34'.search(/\d{4}/) // 4

          match

          返回匹配到的子串

          'a12b2334c34'.match(/\d{4}/) // ["2334"]

          replace

          替換匹配到的子串

          'a12b2334c34'.replace(/\d{4}/, 'cccc') // "a12bccccc34"

          split

          將字符串分割成數組

          'a12b2334c34'.split(/\d{4}/) // ["a12b", "c34"]

          斷言

          正向先行斷言 (?=exp)

          代表字符串中的一個位置,緊接該位置之后的字符序列能夠匹配 exp

          /f(?=234)/.test('123abcf234acd') //true

          負向先行斷言(?!exp)

          代表字符串中的一個位置,緊接該位置之后的字符序列不能匹配 exp

          /f(?!234)/.test('123abcf234acd') //false

          ****常用的正則表達式****

          Email 地址:

          ^\w ([- .]\w )*@\w ([-.]\w )*\.\w ([-.]\w )*$

          URl驗證

          [a-zA-z] ://[^\s]* 或 ^http://([\w-] \.) [\w-] (/[\w-./?%&=]*)?$

          密碼驗證

          (?!^[0-9] $)(?!^[A-z] $)(?!^[^A-z0-9] $)^[^\s\u4e00-\u9fa5]{6,16}$

          郵編驗證

          [1-9]d{5}(?!d)

          手機號碼驗證

          ^1\d{10}$

          漢字驗證

          ^[\u4e00-\u9fa5]{0,}$


          主站蜘蛛池模板: 国产免费一区二区三区在线观看| 国产乱人伦精品一区二区 | 亚洲狠狠狠一区二区三区| 日韩精品一区二区三区中文精品| 日韩色视频一区二区三区亚洲| 伊人色综合一区二区三区| 日韩精品一区二区三区在线观看| 精品无人区一区二区三区| 久久精品午夜一区二区福利 | 爆乳无码AV一区二区三区| 亚洲av日韩综合一区在线观看| 一区二区三区视频在线播放| 日韩一区二区在线免费观看| 精品无码人妻一区二区三区18| 亚洲色精品VR一区区三区| 麻豆文化传媒精品一区二区| 久久久久国产一区二区三区| 亚洲一区二区三区在线播放| 国产福利电影一区二区三区,日韩伦理电影在线福 | 中文字幕AV一区二区三区| 亚洲午夜福利AV一区二区无码| 无码人妻一区二区三区免费视频 | 亚洲熟妇无码一区二区三区| 亚洲日本精品一区二区 | 国产在线一区二区三区在线| 一区二区国产在线观看| 日本亚洲国产一区二区三区| 无码一区二区三区在线观看| 99久久人妻精品免费一区| 亚洲乱码一区二区三区国产精品| 波多野结衣一区二区三区88| 能在线观看的一区二区三区| 综合人妻久久一区二区精品| 亚洲a∨无码一区二区| 色噜噜狠狠一区二区| 亚洲欧洲一区二区| 欧美日韩精品一区二区在线观看| 亚洲国产综合精品中文第一区| 国产激情无码一区二区| 伊人久久精品无码av一区| 久久精品国产亚洲一区二区三区 |