javascript正則表達式從0開始學習

正則表達式在js中主要是對字符串進行匹配,常用在輸入驗證方面,如郵箱,手機號等。比起循環的判斷字符串中的每一個字符,正則表達式往往更能節省性能,並起到事半功倍的效果。以下開始js正則的學習之路。

書寫方式:

1.字面量表示:  

/ab/i        ---由兩個/組成    

/pattern/attributes

2.RegExp構造函數:  

var reg  =new RegExp(“ab“,”i“);              ----同1的效果

new RegExp(pattern, attributes);


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

修飾符:

對於上面的兩種定義方式,其中字符i即爲修飾符的一種,js正則修飾符共有三種


i          忽略大小寫
g   執行全局匹配(查找所有匹配而非在找到第一個匹配後停止)。
第三種就是m,表示執行多行匹配,沒有大的用處。


i:  

        例如測試字符串“Abc”中是否含有“ab”

        不加i  ----------   document.write("/ab/".test("Abc")) ;           //false; 

        加i     -----------  document.write("/ab/i".test("Abc")) ;           /true/;  加上i後輸出就爲true了,即忽略了“ab”的大寫方式。

g:

        例如將字符串”a b c“中的空格替換爲$符

        不加g ----------  document.write("a b c".replace(/\s/,"$"));   //a$b c       其中\s代表空格,結果是隻替換了第一個就停止了

        加g    -----------  document.write("a b c".replace(/\s/g,"$"));   //a$b$c     加上g後的效果是將字符串”a b  c“中的所有空格都替換了,(注意replace裏的正則並沒有加引號)。


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

RegExp 對象方法:

方法的參數爲String,調用者爲RegExp(因爲方法是屬於RegExp對象的,所以RegExp爲調用者)

1.  exec(string):

檢索字符串中正則匹配的值。

返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值爲 null。

例如: /ab/.exec("1a2d")     // null 


2.  test(string):

檢索字符串中是否包含正則匹配的值。

返回 true 或 false。

例如: /ab/.test("1abd")     // true  測試字符創“1abd”中是否包含字符串“ab”


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

String對象的與正則相關的方法:

方法的參數爲RegExp,調用者爲String(因爲方法是屬於String對象的,所以String爲調用者)

1. search(RegExp):

檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。

返回第一個字符的位置,沒有找到則返回-1

例如

       "abcdefgbc12".search(/bc/)       // 1    從字符創“abcdefg” 中檢索“bc”,找到”bc“出現的第一個位置是1(注意,search只要找到第一個就會返回,而不管有幾處都能匹配)

       "abcdefgbc12".search(/bc34/)       //-1    從字符創“abcdefg” 中檢索“bc12”,沒有找到“bc12”,所以返回-1


2. match(RegExp):

在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。http://write.blog.csdn.net/postedit/21075889

返回匹配結果的數組。該數組的內容依賴於 regexp 是否具有全局標誌 g。

例如

       "abcdefgbc12".match(/bc/)     // [bc]           返回匹配“bc”返回的數組,因爲RegExp沒有g標誌,所以返回bc

      "abcdefgbc12".match(/bc/g)     // [bc,bc]    返回匹配“bc”返回的數組,因爲RegExp有g標誌,所以返回所有的匹配

      "abcdefgbc12".match(/bc5/)     //null          沒有匹配到bc5,返回null


3.  replace(RegExp):

用於在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。

如果 regexp 具有全局標誌 g,那麼 replace() 方法將替換所有匹配的子串。否則,它只替換第一個匹配子串。

返回經過替換後的新字符串

例如:

      "123@456@7".replace(/@/g,"!")     // 123!456!7    將"123@456@7"中的所有“@”字符替換爲 “!”

       "123@456@7".replace(/!/g,"@")     // 123!456!7     將"123@456@7"中的所有“!”字符替換爲 “@”,因爲沒有找到@,所以返回原字符串


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正則的量詞匹配

^n   :匹配任何以n開頭的字符串。

  /^b/.test("bac")     //true

n+   :匹配任何包含至少一個 n 的字符串。

/b+/.test("abbc") //true

n*   :匹配任何包含零個或多個 n 的字符串

  /ab*/.test("aac") //true

/ab*/.test("cbbbac") //true

n?   :匹配任何包含零個或一個 n 的字符串

  /ab?c/.test("ac") //true 因爲a後面的b爲0個

/ab?c/.test("abbc")   //false 因爲a後面的b超過了一個所以爲false,如果將?換成*或+,結果爲true

n$   :匹配任何結尾爲 n 的字符串。

/ab$/.test("eeeeeab") //true

/ab$/.test("eeeeeabc")//false,因爲ab並不是結尾

n{x}   :匹配包含 X 個 n 的序列的字符串。

  /ab{4}/.test("eeeeeabbbba")  //true

/ab{4}/.test("abbbbb") //true爲什麼該字符串裏有5個b,執行結果也是true,是因爲只要包含x個b即可,即使後面還有b

n{x,}   :匹配至少包含 X 個 n 的序列的字符串。

  /ab{4}/.test("abbbbb") //true

n{x,y}   :匹配至少包含 X 個 n 或y個n的字符串。

  /ab{2,4}/.test("abbc") //true

/ab{4,2}/.test("abbc") //SyntaxError: Invalid regular expression: /ab{4,2}/: numbers out of order in {} quantifier.

                                                          //這是實際測試結果,說明x必須大於或等於y,而不能小於y

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正則的範圍匹配

範圍匹配主要是採用[ ],如下

[ abcd ]   :查找方括號之間的任何字符。

   /[ab]/.test("12b")    //true

  /[ab]/.test("12a")   //true 

  /[ab]/.test("12a34b")   //true

[^abcd ]   :查找任何不在方括號之間的任何字符。

  /[^ab]/.test("ab") //fasle

/[^ab]/.test("acb") //true 因爲c不既不是a,也不是b

[a-f]   :中間加上-   則代表範圍,該表達式爲a到f

  /[a-f]/.test("Dghi") //fasle D不在該範圍,如果改成/[a-f]/i.test("Dghi"),即不區分大小寫,則結果爲true

/[a-f]/.test("eghi") //true 因爲e在a到f的範圍內

常用的有:

/[a-z]/ 小寫a到小寫z單一字符/[A-Z]/ 大寫A到大寫Z單一字符/[0-9]/ 0到9單一字符 [a-zA-Z] 大小寫單一字符

 大寫字母的順序是在小寫字母前面的,所以[A-g]是正確的,[a-G]則會報錯

|  :單豎線代表或者, 匹配的要麼是該符號左邊的子表達式,要麼它右邊的子表達式,即|的左邊和右邊分別是一個整體。

   /ab|cd/.test("1ab23")  //true

   /ab|cd/.test("ac")       //false

( ):小括號代表子匹配

   /(ab)/.test("1ab23")  //true

  /(ab)ef/.test("1ab23")  //false

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正則的元字符匹配

. :代表任意字符

   /./.test("%")   //true,如果需要匹配單個.怎麼辦,需要用到下方的轉義字符

\ :轉義字符,對一些有特殊意義的字符轉義,使能匹配到特殊字符,

  /\./.test("%")  //false因爲%不是.,此處的.已經被轉義,不是任意字符

/\./.test(".abc")  //true 

\s :小s代表空格

  /ab\s2/.test("1ab 2")  //true

\S :大S代表非空格

/ab\S2/.test("1ab 2")   //false

\d :匹配數字

\d :匹配非數字

\w :匹配單詞字符(下劃線,數字或字母)

\W :匹配非單詞字符


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

常用的一些字符做一下解析

驗證手機號(國內的):

  /^[1][3|5][0-9]{9}$/ 以1開頭,並且之後緊接着3或者5,然後是9個0到9的數字

驗證輸入是否只有數字,字母或下劃線組成:   

/^[0-9a-zA-Z\_]+$/ 

驗證郵箱:

  目前網上給的各種驗證郵箱的例子不一致,所以在此只做個思路的分析,之後發現更好地再貼上,

  郵箱的格式應該是    多個字符(數字或_)  @   多個字符(數字或_).多個字符結尾

    所以先簡單按字面意思寫一個    /^[0-9a-zA-Z\_]+@[0-9a-zA-Z\_]+\.[a-zA-Z]+$/




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章