正則表達式技術詳解 Regular Expression

一、正則表達式的用途:
1、兩種用法

  • regexp.xxx(string)
  • string.yyy(regexp)

2、常用到在一段文本中搜索、匹配、替換指定形式的文本
eg:詞語出現頻率統計、驗證郵箱等
二、語法
1、定義正則表達式對象用Perl風格的直接量語法
/pattern/attribute

  • 不加引號
  • / 不能省略
  • pattern –>表達式內容
  • attribute –> i,g,m

2、表達式內容可以包含以下幾類:

  • 字符類:用於匹配普通字符
    • 所有的單個大小寫字母、數字都是一個正則表達式
    • 正則表達式中的特殊語法含義的元字符,用\轉義
      • . \ / * ? + [ ( ) ]{ } ^ $ |
  • 量詞元字符:指定字符出現的次數
字符 含義
n? 匹配n出現0次或1次
n* 匹配n出現0次或多次
n+ 匹配n出現1次或多次
n{x} 匹配n出現x次
n{x,y} 匹配n出現x次到y次
n{x,} 匹配n出現>=x次
  1. 範圍選擇
字符 含義
[abc] 匹配指定集合內的任意一個字符
[^abc] 匹配不在指定集合內的任意一個字符
[0-9] 匹配任意一個數字
[a-z] 匹配任意一個小寫字母
A-Z] 匹配任意一個大寫字母
[A-z] 匹配大A到小z的所有字符
exp1 | exp2 匹配exp1或exp2
  1. 特殊匹配符
字符 含義
\d 匹配一個數字
\D 匹配一個非數字
\w 匹配一個數字、字母、下劃線
\W 匹配一個非數字、字母、下劃線
\s 匹配一個空白符
\S 匹配一個非空白符
. 匹配除了回車和換行之外的任意單字符
  1. 指定匹配位置
字符 含義
^ 匹配字符串開頭
$ 匹配字符串結尾
\b 匹配單詞的邊界
\B 匹配單詞的非邊界
? = x 匹配其後緊接x的字符串
? != x 匹配其後沒有緊接x的字符串
  1. 指定修飾符
字符 含義
i 忽略大小寫
g 全局匹配
m 多行匹配

三、創建正則表達式對象的兩種用法

1.直接量表示法 (perl寫法)

var reg = /式子/igm;

2.對象創建法(JS寫法)

var reg = new RegExp("式子","igm");

在JS中,\是轉義的意思,因此

var reg = new RegExp("abs\d","i"); //false

正確寫法:

var reg = new RegExp("abs\\d","i"); //false

四、RegExp對象屬性

  1. global 判斷是否爲全局匹配
  2. ignoreCase 判斷是否忽略大小寫
  3. multiline 判斷是否支持多行匹配
  4. source 返回模式匹配所使用的文本(原式子) 《只讀》
var str = "abcdefg";
var reg = /cd/gm;
console.log(reg.global); //true
console.log(reg.ignoreCase); //false
console.log(reg.multiline);  //true
console.log(reg.source); //cd

5、RegExp.$n(n取值:1-99): 指代最近一次成功匹配第N個分組的內容,也就是與正則表達式匹配的第n個 子匹配(以括號爲標誌)字符串

var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; //正則表達式 匹配出生日期(簡單匹配)     

r.exec('1985-10-15');

s1=RegExp.$1;

s2=RegExp.$2;

s3=RegExp.$3;

console.log(s1+" "+s2+" "+s3)//結果爲1985 10 15

-注意:$n是RegExp的屬性

var reg =/ /i;
reg.$1;   //錯誤語法

6、lastIndex 指定下次從哪開始匹配

lastIndex必須和g連用

  • 該屬性存放一個整數,它聲明的是上一次匹配文本之後的第一個字符的位置。
  • 上次匹配的結果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它們都以 lastIndex 屬性所指的位置作爲下次檢索的起始點。這樣,就可以通過反覆調用這兩個方法來遍歷一個字符串中的所有匹配文本。
  • 該屬性是可讀可寫的。只要目標字符串的下一次搜索開始,就可以對它進行設置。當方法 exec() 或 test() 再也找不到可以匹配的文本時,它們會自動把 lastIndex 屬性重置爲 0。
var str = "The rain in Spain stays mainly in the plain";
var patt1 = new RegExp("ain", "g");

patt1.test(str)
console.log("Match found. index now at: " + patt1.lastIndex);  //8

五、RegExp常用方法

  1. test()
    ①檢索字符串指定的值
    ②會影響lastIndex
    ③返回true false
var str = "abcdefg";
var reg = /cd/gm;
console.log(reg.test(str));  //true
console.log(reg.lastIndex);  //4 <下次從4開始查找>
  1. exec()
    ①會影響lastIndex
    ②返回找到的索引內容和input【關聯數組】 / null
var str = "abcdefg";
var reg = /cd/gm;
console.log(reg.exec(str));  //[ 'cd', index: 2, input: 'abcdefg' ]
console.log(reg.lastIndex);  //4 <下次從4開始查找>
  1. compile() :

    ① 該方法可以編譯指定的正則表達式,編譯之後的正則表達式執行速度將會提高,如果正則表達式多次被調用,那麼調用compile方法可以有效的提高代碼的執行速度,如果該正則表達式只能被使用一次,則不會有明顯的效果

② 基本語法:objReg.compile(pattern[,flag])
objReg必選項,RegExp對象變量的名稱
pattern 必選項 正則表達式
flag 可選項 匹配選項

發佈了70 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章