1. 程式人生 > >JS中正則表達式

JS中正則表達式

d+ 換行 font 替換 import p s 比較 模式匹配 str2

正則表達式用於對字符串模式匹配及檢索替換,是對字符串執行模式匹配的強大工具。簡單來說正則表達式就是處理字符串的,我們可以用它來處理一些復雜的字符串。

創建方式

var reg = new RegExp(pattern,modifiers);  //構造函數創建方式,pattern 和 modifiers 均為字符串,
var reg = /pattern/modifiers;    // 字面量創建方式

pattern(模式):描述了表達式的模式

modifiers(修飾符) :用於指定不區分大小寫、全局匹配和多行匹配(i、g、m),當沒有時默認為區分大小寫只匹配第一個

字面量創建方式和構造函數創建方式的區別

1、字面量創建方式不能進行字符串拼接,實例創建方式可以

var regParam = ‘cm‘;
var reg1 = new RegExp(regParam+‘1‘);
var reg2 = /regParam/;
console.log(reg1);  //   /cm1/
console.log(reg2);  //  /regParam/

2、字面量創建方式特殊含義的字符不需要轉義,實例創建方式需要轉義

var reg1 = new RegExp(‘d‘);   //    /d/ 
var reg2 = new RegExp(‘\\d‘)  //   /\d/
var reg3 = /\d/;              //
/\d/

修飾符

i:不區分大小寫

var str = "Visit RUnoob";
var patt1 = /runoob/;
var patt2 = /runoob/i;
console.log(patt1.test(str))   //false
console.log(patt2.test(str))   //true

g:全局匹配,(即查找所有匹配而非在找到第一個匹配後停止)

var str="Is this all there is?";
var patt1=/is/g;
console.log( str.match(patt1) );   // ["is", "is"]

m:執行多行匹配。多行匹配在需要匹配的字符串裏有換行符時凸顯出它的意義。如果沒有用多行匹配,那麽不管多少換行符,該字符串就只視為一行,只有一對頭和尾。如果使用了多行匹配,那麽每一行就都有一對頭和尾,使用 ^ 和 $ 進行匹配時結果就不一樣。

var str="This an \n good"; 
var reg=/an$/;
var reg2=/an$/m;
console.log( reg.test(str) );     //false
console.log( reg2.test(str) );   //true

var str2="This an \n good an"; 
var reg3 = /an$/mg;
console.log( str2.match(reg3) );     // ["an", "an"]

元字符: http://www.runoob.com/jsref/jsref-obj-regexp.html

\d : 0-9之間的任意一個數字  \d只占一個位置
\w : 數字,字母 ,下劃線 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d
\W : 除了\w
\S : 除了\s
 . : 除了\n之外的任意一個字符
 \ : 轉義字符
 | : 或者
() : 分組
\n : 匹配換行符
\b : 匹配邊界 字符串的開頭和結尾 空格的兩邊都是邊界 => 不占用字符串位數
 ^ : 限定開始位置 => 本身不占位置
 $ : 限定結束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一個都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三個字母中的任何一個 [^abc]除了這三個字母中的任何一個字符

代表次數的量詞元字符

* : 0到多個
+ : 1到多個
? : 0次或1次 可有可無
{n} : 正好n次;
{n,} : n到多次
{n,m} : n次到m次

正則表達式對象(RegExp)的方法

exec:返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。

reg.exec() 方法比較復雜,全局匹配和不全局匹配結果不一樣,當用到分組時結果又不一樣。

var str = ‘abc123cba456aaa789‘;
var reg = /\d+/;
console.log( reg.exec(str) )  //["123", index: 3, input: "abc123cba456aaa789"];
console.log(reg.lastIndex)  //0 

// [ "123",index:3,input:"abc123cba456aaa789" ] 中,
// "123" 表示我們捕獲到的字符串
// index:3 表示捕獲到的字符串的起始位置
// input 表示原有的字符串

當我們用exec進行捕獲時,如果正則沒有加 ‘g‘ 標識符,則exec捕獲的每次結果都是同一個,當正則中有 ‘g‘ 標識符時捕獲的結果就不一樣了,再來看剛剛的例子

var str = ‘abc123cba456aaa789‘;
var reg = /\d+/g; //此時加了標識符g
console.log(reg.lastIndex)  // lastIndex : 0 

console.log(reg.exec(str))  //  ["123", index: 3, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 6

console.log(reg.exec(str))  // ["456", index: 9, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 12

console.log(reg.exec(str))  // ["789", index: 15, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 18

console.log(reg.exec(str))  // null
console.log(reg.lastIndex)  // lastIndex : 0

// 每次調用exec方法時, 捕獲到的字符串都不相同
// lastIndex: 這個屬性記錄的就是下一次捕獲從哪個索引開始,當未開始捕獲時,這個值為0。 
// 如果當前次捕獲結果為null。 那麽lastIndex的值會被修改為0.下次從頭開始捕獲。
// 而且這個lastIndex屬性還支持人為賦值。

exec的捕獲還受分組()的影響

let str = ‘aaabbb‘;
let reg = /(a+)(b+)/;
let reg2 = /(a+)(?:b+)/;

console.log( reg.exec(str) );    //["aaabbb", "aaa", "bbb", index: 0, input: "aaabbb", groups: undefined]
console.log( reg2.exec(str) );  //["aaabbb", "aaa", index: 0, input: "aaabbb", groups: undefined]

//exec執行匹配的時候, 會先返回整體匹配值, 再分別返回按照正則表達式中由括號擴起來的小分組進行匹配的值。?: 可以取消返回該分組的匹配值。

JS中正則表達式