JavaScript正則表達式小記

前言

本文主要爲筆者在學習JavaScript正則過程當中的一點學習筆記,主要講述JavaScript的正則表達式及其相關,包含String的match、replace、search和split方法。javascript

建立正則

  • 字面量方式:var reg = /abc/;
    腳本加載後編譯,性能更好
  • RegExp對象的構造函數 var reg = new RegExp("abc");

特殊字符

字符 含義
^ 匹配字符串的開始。若是多行標示被設爲true,同時匹配換行後緊跟的字符
$ 匹配字符串的結尾。若是多行標示被設爲true,同時匹配換行前緊跟的字符
* 匹配前一個字符0次或者是屢次
+ 匹配前一個字符1次或者屢次,等同於{1,}
? 匹配前一個字符0次或者1次,等同於{0,1}
. 匹配任何除了新一行開頭字符的任何單個字符 /.n/將會匹配」an apple is on the tree」中的「an」和「on」,不匹配「nay」
(x) 匹配‘x’而且記住匹配項,即捕獲分組.匹配到子字符串能夠經過結果數組的[1],…,[n]進行訪問
(?:x) 匹配‘x’可是不記住匹配項,即非捕獲分組.匹配到子字符串不能經過結果數組的[1],…,[n]進行訪問,性能略高
x(?=y) 匹配‘x’僅僅當‘x’後面跟着‘y’,可是不記住‘y’。正向確定查找,非捕獲分組的一種
x(?!y) 匹配‘x’僅僅當‘x’後面不跟着‘y’,不記住‘y’。正向否認查找,非捕獲分組的一種
x|y 匹配‘x’或‘y’
{n} n是正整數,匹配前面一個字符恰好發生了n次
{n,m} n,m都是正整數。匹配前面的字符至少n次,最多m次。若是n或者m的值是0,這個值被忽略
[xyz] 匹配方括號中的任意字符。可使用破折號(-)來指定一個字符範圍。
[^xyz] 匹配任何沒有包含在括號中的字符,可使用破折號指定一個字符範圍
[\b] 匹配一個退格(U+008)
\b 匹配一個單詞的邊界
\B 匹配一個非單詞邊界
\d 匹配一個數字
\D 匹配一個非數字字符
\s 匹配一個空白字符,包括空格、製表符、換頁符和換行符
\S 匹配一個非空白字符
\t 匹配一個水平製表符
\v 匹配一個垂直製表符
\w 匹配一個單字字符
\W 匹配一個非單子字符
\n 匹配一個換行符
\f 匹配一個換頁符
\r 匹配一個回車符
\num num 是一個正整數,返回引用到捕獲分組的副字符串。 eg/\w+(,)?\w+(!)?\w+\1\w+\2/匹配"beijing,the!capital,of!china"
標誌值
g 全局搜索(global)
m 多行搜索(multiline)
i 不區分大小寫(ignoreCase)

RegExp方法

  • exec(string)
    返回一個數組。eg:php

    var myRe = new RegExp("d(b+)d", "g"),
    var myArray = myRe.exec("cdbbbdc");
    屬性或索引 描述 例子中對應的值
    myArray 匹配到的字符串和全部被捕獲的子字符串 [「dbbbd」, ‘bbb’]
    [0] 匹配的全部字符串 ‘dbbdd’
    index 匹配到的字符串開始的索引值(以0開始) 1
    input 輸入的初始字符串 「cdbbbdc」
    myRe
    lastIndex 下一次匹配開始的索引值(只有g參數時纔有用) 5
    source 模式文本 「d(\b+)d」
  • test(string)
    return true/false
    查詢字符串裏是否有該正則的匹配css

String方法

  • match(RegExp)html

    1. 若是正則表達式中沒有g標誌,返回和RegExp.match(string)相同的結果。且返回的數組同時擁有input和index屬性
    2. 若是正則表達式包含g標誌,則返回一個包含全部匹配結果的數組(無input和index屬性)。沒有匹配到,則返回null
  • split(RegExp)
    經過把字符串分割成子字符串來把一個string對象分割成一個字符串數組java

  • search(RegExp)
    查看字符串對象與一個正則表達式是否匹配,返回正則表達式在字符串中首次匹配項的索引。不然,返回-1
    ps:若是傳入一個非正則表達式對象,則會使用new RegExp(obj)隱式地將其裝換爲正則表達式對象。node

  • replace(RegExp, replace|function)
    使用replacement替換string中匹配的RegExp,返回替換後的字符串,不應表原字符串。
    替換字符串能夠插入下面的特殊變量名:nginx

    變量名 表明的值
    $ 插入一個」$」
    @@bodyamp; 插入匹配的字符串
    @@title 插入當前匹配的字符串左邊的內容
    $’ 插入當前匹配的字符串右邊的內容
    $n or $nn n或nn是十進制的數字,那麼插入第n個括號匹配的字符串

    指定一個函數做爲參數
    這種狀況下,當匹配執行後,該函數就會執行,函數的返回值做爲替換字符串(上面的特殊參數在這裏不能使用)。若是正則表達式是全局匹配模式,則該function將被屢次調用,每次匹配都會被調用。
    該函數的參數:git

    變量名 表明的值
    match 匹配的字符串(對應上面的@@bodyamp;)
    p1,p2,…,pn 表明RegExp對象中第n個括號匹配的字符串(對應於上述的$1,$2…)
    offset 匹配到的子字符串在原字符串中的偏移量。
    string 被匹配的原字符串

幾個簡單小DEMO

下面使用上面剛敘述過的正則表達式來練習下github

  • DEMO1:
    將給定的任意一串阿拉伯數字例如:123456789 返回用逗號分割的結果123,456,789
    function test1(str) {
         return str.replace(/\B(?=(?:\d{3})+$)/g, ',');
     }
  • DEMO2:
    隨機給定的一串字符,將該字符串裏面的全部的阿拉伯數字均增加2倍,而後返回該字符串
    function test2(str) {
         str.replace(/\d/g, function(val) {
             return val * 2;
         });
     }
相關文章
相關標籤/搜索