正則表達式隨筆

正則表達式

一直使用簡單的正則表達式,遇到難點的就沒法簡潔高效的寫出正則,故此整理一篇須要記憶應用的正則使用。正則表達式

正則表達式做用

  • 匹配一個字符串的子字符串(子集),或者替換該字符串。

不得不提的String和reg的經常使用方法

  • codePointAt(pos) 方法:獲得字符的碼位。漢字能夠獲得完整的碼位
  • fromCodePoint() 方法:參數提供字符的碼位返回對應的字符
  • include() 方法: 若是檢測到指定文本就返回true,不然返回false。接受第二個參數爲開始搜索的指定索引值
  • startsWith() 方法: 若是在起始位置檢測到指定文本就返回true,不然返回false。接受第二個參數爲開始搜索的指定索引值
  • endsWith() 方法: 從字符串末尾往前匹配。若是在結束部分檢測到指定文本返回true,不然返回false。接受第二個參數爲開始搜索的指定索引值
  • repeat()方法: "o".repeat(3) // ooo 表示重複某個字符串指定次數
  • reg.test(str)方法: test()方法執行一個檢索,用來查看正則表達式在指定的字符串(str)中是否能被匹配。返回 true 或 false。
  • reg.exec(str)方法: 方法在一個指定字符串中執行一個搜索匹配。找到返回一個結果數組或未找到 null。 返回的數組將徹底匹配成功的文本做爲第一項,將正則括號裏匹配成功的做爲數組填充到後面數組

    • 全局調用和非全局調用:全局調用時,在匹配後,它將把RegExp實例的lastIndex屬性設置爲匹配文本的最後一個字符的下一個位置,當 exec() 再也找不到匹配的文本時,它將返回null,並把lastIndex屬性重置爲0
  • str.search(reg)方法: 執行正則表達式和 String對象之間的一個搜索匹配。若是匹配成功,則 search() 返回正則表達式在字符串中首次匹配項的索引,不然,返回 -1。與上面的reg.test()相似可判斷是否存在某個正則模式函數

    • search() 方法不執行全局匹配,它將忽略標誌g,它同時忽略正則表達式對象的lastIndex屬性,而且老是從字符串的開始進行檢索,這意味着它老是返回字符串的第一個匹配的位置
    • 若是傳入一個非正則表達式對象,則會使用 new RegExp(obj) 隱式地將其轉換爲正則表達式對象。
  • str.match(reg)方法: 當一個字符串與一個正則表達式匹配時, match()方法檢索匹配項。url

    • 參數:若是傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換爲一個reg
    • 參數:若是你未提供任何參數,直接使用 match() ,那麼你會獲得一個包含空字符串的 Array :[""] 。
    • 返回值:若是字符串匹配到了表達式,會返回一個數組,數組的第一項是進行匹配完整的字符串,以後的項是用圓括號捕獲的結果。若是沒有匹配到,返回null
    • 全局調用:全局匹配返回的數組的內容與非全局大不相同,它的數組元素中存放的是字符串中全部的匹配子串,並且也沒有index屬性或input屬性
    • 非全局調用:只在字符串中匹配依次,若沒有匹配到文本,match()返回null,匹配到返回一個數組,數組中第一個元素存放匹配到的文本,其他的元素存放的是與正則表達式的子表達式匹配的文本,數組具備兩個屬性,index ( 匹配文本的起始字符在字符串位置 )和 input屬性
  • String.prototype.replace(reg, function): 是將匹配內容應用函數後返回一個新字符串。
  • String.prototype.split(reg): 以指定的分隔符字符串將一個String對象分割成字符串數組, 若是分隔符是("")則會每一個字符都切割。spa

    • 注意:當字符串爲空時,split()返回一個包含一個空字符串的數組,而不是一個空數組,若是字符串和分隔符都是空字符串,則返回一個空數組。
  • Array.prototype.join()方法: join() 方法將一個數組(或一個類數組對象)的全部元素鏈接成一個字符串並返回這個字符串,不改變原數組。prototype

    • 參數: 指定一個字符串將數組的每個元素以這個字符串拼接,()爲空默認爲,("")是引號時則元素之間沒有任何字符。這個方法經常和String.prototype.split()連用

一些經常使用的匹配字符

預約義類code

字符集 等價於
. [ ^ rn ] 除了換行和回車符以外全部字符
\d [ 0-9 ]
\D [ ^ 0-9 ]
\s [ tvnr ] 包含製表符、空格、垂直製表符
\S [ ^ tvnr ]
\w [a-zA-Z ]
\W [ ^ a-zA-Z ]

量詞對象

重複修飾符 描述 示例
{n} 指定n 次 /d{5}/數字出現5次
{n,} 最少n次 /d{5,}/數字至少出現5次
{n,m} n值m次
? 最多一次,{0,1}
+ 最少一次
* 任意次

邊界字符集索引

字符 含義
^ 以 xxx開頭
$ 以 xxx結尾
\b 單詞邊界
\B 非單詞邊界

正則語法

構造方式

  • const re1 = /\d/ 字面量語法 建立
  • const re2 = new RegExp(\d) 構造函數 建立

使用正則搜索

str = "It will rain tomorrow"

//字符串在前
str.startWith("will") //true
str.endsWith("will") //true
str.includes("will") //true

str.match(/\w{3,}/g) // will rain tomorrow
str.search(/\w{3,}/g) // 3

//正則表達式在前

/\w{3,}/g.test(str) //true

....

經常使用用法

  • 經常使用修飾符
g:global,全文搜索,不添加的話搜索到第一個結果中止搜索
i:ingore case,忽略大小寫,默認大小寫敏感
m:multiple lines,多行搜索
  • \D 和 \S \W經常使用來去除不想要的
  • \D可用來去除不是數字的的字符ip

    好比: var yourNumber  = 'phoneNumber15555555555'
    var number.replace(/\D/,'')
  • \S 可用來確保必填字段中字符

    var username = '  daixixi '
    var value = /\S/.test(username)
  • 各類修飾符時修飾前一個元素出現的次數

    var a = "hello world2hello china".match(/\w+/)
  • .匹配除了換行和回車符以外字符,能夠使用[/\s\S/]匹配全部字符
  • 分組 : 當某一個修飾符對前一個元素進行影響時,若想對一組有做用則使用分組 /(ab)+/ 匹配至少一組連續的ab
  • __或__: 使用豎線表示或,/a|b/ 表示匹配a或b(有個笑話就是這個|寫成中文的丨怎麼都查不出。。。)
  • 取反 :有限字符集之外的字符 /[^abc]/ 除abc之外字符
  • __範圍__: 使用[a-z] 表示a到z 之間任意一個
  • __字符類__:使用[]來構建一個簡單的類,/[abc]/ 表示匹配其中任意一個都可
  • 貪婪模式和非貪婪模式: 在設置了量詞後匹配是默認是貪婪模式會即以最大的量詞進行匹配,不過在量詞後面加上?後就能夠取最小量詞進行匹配,是否匹配結束通常取決因而否加g

    '123456789'.match(/\d{3,5}/g); //["12345", "6789"]  
        '123456789'.match(/\d{3,5}?/g); //["123", "456", "789"]
  • 分組嵌套:

    var str = '<a href="http://a.com">"網址"</a>'
    var reg = /href="((https?:)?\/\/.+?)"/
    console.log(str.match(reg))
    
    var url = str.match(reg)[1]
  • 前瞻:
表達式 含義
exp1(?=exp2) 匹配後面是exp2的exp1
exp1(?!exp2) <span class="Apple-tab-span" style="white-space:pre"></span>匹配後面不是exp2的exp1

獲得是exp1的值,不過須要知足條件纔會被匹配中

相關文章
相關標籤/搜索