今天我們來講一下正規表示式的基本使用通過上面的兩個例子,我們已經知道m修飾符也算是查詢全域性的修飾符但是它匹配到乙個就不會再進行匹配了
匹配結尾的$
let str = "abv12"
let reg = /v$/g
console.log(reg.exec(str)) // null
let str = "abv12v"
let reg = /v$/g
console.log(reg.exec(str)) // ["v", index: 5, input: "abv12v", groups: undefined]
^匹配開頭的
let str = "abv12v"
let reg = /^v/g
console.log(reg.exec(str)) // null
let str = "vabv12v"
let reg = /v$/g
console.log(reg.exec(str)) //["v", index: 0, input: "vabv12v", groups: undefined]
^和$配合使用
let str1 = "abcd 1"
let reg1 = /^[a-z]+\s+\d+$/i
console.log(str1.replace(reg1, '*')) // *
匹配abcd 1,需要對應的規則分別是abcd ^[a-z] 空格s d數字$
匹配n個
最少n個
最少匹配n個,最大匹配n個
()捕獲性分組使用
let str = '2018-03-02'
let reg = /^(\d)-(\d)-(\d)$/
console.log(str.replace(reg, "$1/$2/$3")) // 2018/03/02
上面的例子使用了()和{}配合使用,分成了三個組,第乙個組匹配四個數字,第二個和第三個匹配兩位數字,然後利用了^開始匹配的四位數字開始和$匹配兩位數字結束,將-替換/
()非捕獲性使用 非捕獲性分組通過將子表示式放在"?:"符號後,我理解的非捕獲性分組就是()有根沒有都一樣
let str = '2018-03-02'
let reg = /^(?:\d)-(?:\d)-(?:\d)$/
console.log(str.replace(reg, "$1/$2/$3")) // $1/$2/$3
上面的例子就是乙個非捕獲性的例子,在子表示式前面加上?:就可以解除小括號的分組模式所以匹配不到
說到貪婪模式和非貪婪模式,首先我要介紹一下量詞,因為非貪婪模式要用在量詞後面
n匹配包含x個n的序列的字串
n匹配包含x至y個n的序列的字串
n匹配至少包含 x 個 n 的序列的字串
n*匹配任何包含零個或多個 n 的字串
n?匹配任何包含零個或乙個 n 的字串
n+匹配任何至少包含乙個 n 的字串
貪婪模式就是盡可能多的匹配
let str = 'abcdefghijk123'
let reg = /\w/
console.log(str.replace(reg, "*")) // *efghijk123
上面的例子則為貪婪模式它會匹配到最大的那個位數
let str = 'abcdefghijk123'
let reg = /\w?/
console.log(str.replace(reg, "*")) // *bcdefghijk123
上面的例子則為非貪婪模式,只會去匹配最少的位數
先行斷言?=
let str = 'abcdefghijk123asd456'
let reg = /\w+(?=123)/g
console.log(str.match(reg)) // ["abcdefghijk"]
上面的例子為先行斷言的例子reg規則必須是後面帶有123的匹配到
先行否定斷言?!
let str = 'bbb123 bbbbb456'
let reg = /b(?!123)/g
console.log(str.match(reg)) // ["bbbbb"]
後行斷言查詢匹配表示式匹配到後面的
let str = 'abcdefghijk123asd456'
let reg = /(?<=123)[a-z]/g
console.log(str.match(reg)) // ["a"]
後行否定斷言,匹配不屬於123的,後面的[a-z]的字元
let str = 'abcdefghijk123asd'
let reg = /(?我感覺先行斷言像後行否定斷言,先行否定斷言像後行斷言
new regexp(pattern,modifiers)
pattern 則為表示式
modifiers 則為修飾符
let reg1 = new regexp('[a-z]','g')
console.log(reg1) // /[a-z]/g
上面的例子我們會得到這個結果是因為regexp物件會將第二個引數修飾符與第乙個引數表示式進行合併
let reg1 = new regexp(/[a-z]/,'g')
console.log(reg1) // /[a-z]/g
上面這個例子我們也會得到我們想要匹配全域性的乙個表示式,但是在es5中如果這樣寫就會出現報錯
let reg1 = new regexp(/[a-z]/,'g')
console.log(reg1.flags) // g
let reg1 = new regexp(/[a-z]/,'i')
console.log(reg1.flags) // i
我們還可以檢測表示式是否使用了修飾符,並且可以知道使用了什麼修飾符
console.log(str.replace(reg, 'xx')) // ******.jpg456.png上面的第乙個例子使用了表示式方法compile它會使表示式重新編譯或是修改,所以第一次匹配的是123,第二次則是456,是因為改變了匹配機制,第二個例子使用用到了替換的方法並且會發現你替換的引數多的話會修改字串的長度
let str = '2018-02-13'
let reg = /-\d/g
console.log(reg.exec(str)) // ["-02", index: 4, input: "2018-02-13", groups: undefined]
上面的例子是查詢帶有-數字不超過2位,返回的是陣列,並且把匹配到的第乙個在最前面的位置
let str = '2018-02-13'
let reg = /-\d/g
console.log(str.search(reg)) // 4
它會返回你表示式匹配到第乙個字元的位置返回,它會對大小寫敏感如果查詢不到會返回-1,無視g
let str = 'this is 1 or 2'
let reg = /\d/g
console.log(str.match(reg)) // [1,2]
它會找出所有與你表示式匹配到的字元放入陣列中
es6的正在提案的乙個方法,它可以摒棄全域性的修飾符,達到全域性的匹配,它會返回乙個遍歷器,然後可以通過結構賦值拿到想要的結果
/^1[3|4|5|7|8][0-9]$/ 匹配手機號開頭必須有1,34578其中的乙個,結尾必須9位數而且是0-9的數字
/^0315(-?)[0-9]$/ 判斷**區號和-可有可無
/^[0-9](-?)[0-9]$/ 匹配1-9的數字必須是四位,可有可無-,匹配7位數字
都是幾個比較簡單的表示式,還需多學習,多練習才能寫出更廣泛更精準的表示式 正規表示式學習
概念 正規表示式,就是用某種模式去匹配一類字串的乙個公式。基礎 下表列出了所有的元字元和對它們的乙個簡短的描述。簡單例子 vi 命令作用 s g 把乙個或者多個空格替換為乙個空格 s 去掉行尾的所有空格 s 在每一行頭上加入乙個空格 s 0 9 0 9 去掉行首的所有數字字元 s b aeio g ...
正規表示式學習
1.元字元 1 匹配任何單個字元 2 匹配括號中的任何乙個字元 可以再括號中使用連字元 來指定子都的區間來簡化表示,如a 0123456789 c等價於a 0 9 c 3 將 之間括起來的表示式定義為 組 4 將兩個匹配條件進行邏輯 或 運算 z f ood則匹配 zood 或 food 5 匹配0...
正規表示式學習
只是點皮毛,先湊合用著了,順便鄙視一下sqlserver,居然不支援正則。b 元字元,代表著單詞的開頭或結尾,也就是單詞的分界處。d 數字 s 任意的空白符,包括空格,製表符 tab 換行符,中文全形空格等 w 字母或數字或下劃線或漢字等 匹配字串的開始 匹配字串的結束 轉義符 除換行符以外的任意字...