js 正則用法-筆記

創建正則表達式

js是通過RegExp類型來支持正則表達式的,主要有2種方式來創建正則表達式:

  1. 以字面量的形式來定義
  2. 使用RegExp構造函數。
    這次做的筆記主要是寫字面量來表示,RegExp構造函數以後再補充。一般情況下字面量用的比較多,但是當正則需要傳參數的時候,必須要用RegExp的寫法(比如說在一個函數中,正則是一個傳進來的參數)

字面量表示

形如:

var express = /pattern/flags;

其中pattern是正則表達式
flags:g表示全局模式,即模式被應用於所有字符串;i表示不區分大小寫;m表示多行模式。

元字符

特別注意:模式中使用的所有的元字符都必須轉義。用\轉義。
元字符有:( { [ \ ^ $ | ? * + . ] } )
例如:

var str = /\[ab\]c/   //匹配第一個"[ab]c"

捕獲組/匹配子項

匹配子項:小括號()(小括號還有另外一個意思,分組操作)

可以把正則的整體叫做母親,然後把左邊第一個小括號裏面的正則,叫做這個母親的第一個子項(捕獲組)。第二個就是第二個子項(捕獲組)。。。。。。
例如:

 var re = /(\d+)(-)/g;

在這裏”\d+”就是第一個捕獲組,“-”是第2個捕獲組

重點區分{}的含義,以及一些特定的符號

1.{} 量詞

{}在正則裏面表示的是量詞

  • {n,m}表示前面的字符最少出現n次,最多出現m次。
  • {n,}至少出現n次
  • {n}真好出現n次
  • + :其實是{1,}的簡寫
  • ? : {0,1},至多1次
  • * : {0,},至少0次

2.() 匹配子項,或者是分組操作

  • 把正則的整體叫做(母親),然後把左邊第一個小括號裏面的正則,叫做這個母親的第一個子項(孩子)。第二個就是第二個子項。。。。。。

3.[] 字符類

  • []在正則裏面表示的是字符類,也就是一組類似的元素,[]中括號裏面的整體代表一個字符。

4.特定的一些符號

  • \s : 一個空格(包括Tab等空白符)
  • \S : 非空格
  • \d : 一個數字
  • \D : 非數字
  • \w : 一個字符 (字母,數字,下劃線_)
  • \W : 非字符
  • \b :獨立的部分,(起始,結束,空格),也就是匹配單詞邊界,注意在單詞邊界匹配的位置,單詞字符後面或前面不與另一個單詞字符直接相鄰。請注意,匹配的單詞邊界並不包含在匹配中。換句話說,匹配的單詞邊界的長度爲零。(不要與 [\b] 混淆。)
  • \B : 非獨立部分,也就是非單詞邊界。匹配位置的上一個和下一個字符的類型是相同的:即必須同時是單詞,或必須同時是非單詞字符。字符串的開頭和結尾處被視爲非單詞字符。
    例如:
var str = 'one two'
var re2 = /one\b/;
alert(re2.test(str));

/one\b/表示one後面不與另一個單詞字符直接相鄰

  • . : 匹配任意字符
    • : 表示一個區域範圍(從小到大)
  • ^ : 如果在正則的最開始位置,代表起始的意思,如果是在[]表示排除
  • $ : 如果在正則的最後位置,代表結束的意思
  • | : 表示或者
  • \數字 : 表示重複子項:\1 重複的第一個子項;\2 重複的第二個子項.
    例如:
var str = 'onesssgsdoso'
var re2 = /(o)(s)\1/;
alert(re2.test(str));

/(o)(s)\1/ 這裏\1就是表示o

var str = '123231a443'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));

//結果是false

var str = '123231a143'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));
//結果是true

所以注意:子項是指匹配到的字符串。

方法

match()

match:正則去匹配字符串,如果匹配成功,就返回匹配成功的數組;如果不成功,返回null;
用法:字符串.match(正則)
例如:

var str = '12ss123s1d23632x';
var re = /\d\d+/g;//全局模式g:全部查找
alert(str.match(re));

結果是[12,123,23632]
注意:match()也可以用來匹配子項,匹配的子項放在返回數組的後幾項,不過這個前提是不加g,加了g就不會返回子項了。
例如:

var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/;
alert(str.match(re));

結果是[sd,s,d]

但如果加了g

var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/g;
alert(str.match(re));

結果就是[sd,sd,sd,sd,sd]

test()

test:正則去匹配字符串,如果匹配成功,返回真,否則返回假;
用法:正則.test(字符串)

serch:正則去匹配字符串,如果成功,返回字符串中第一個匹配項的索引;如果沒找到,則返回-1
用法:字符串.search(正則)。

注意這裏只返回第一個匹配項,不管有沒有g都是這樣。

replace()

replace:正則去匹配字符串,匹配成功的字符去替換成新的字符串;
用法:字符串.replace(正則,字符串);
注意它的第二個參數可以是字符串,也可以是個回調函數:

回調函數

注意函數的參數(注意順序):模式的匹配項,(第一個捕獲組的匹配項,第2個捕獲組的匹配,…),模式匹配項在字符串中的位置,原始的字符串。
這個回調函數應該返回一個字符串,表示被替換的匹配項。
例如:

var str = '2016-7-14';
var re1 = /(\d+)(-)/g;
str = str.replace(re1,function($0,$1,$2){
    //第一個參數是母親,第2個參數是第2個孩子、、、、
    alert($1);
    return $1 + '.'
});

這段代碼中,$0就是2016-,7- ,而對應的$1是,2016,7,對應的$2是-,-

exec() (待補充)

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