正則表達式

正則表達式

1.正則表達式的兩種創建方式

  • 正則表達式字面量方式
//第一種字面量創建方式(編譯時創建)
var regex = /abc/; 
  • 對象方式創建
 //對象方式創建(執行時創建)
var regex1 = new RegExp('abc');

2.正則表達式的修飾符

//igm是修飾符
var r = /abc/igm;
  • i修飾符

默認情況下,正則對象區分字母的大小寫,加上i修飾符以后表示忽略大小寫(ignorecase)。

  • g修飾符

默認情況下,第一次匹配成功后,正則對象就停止向下匹配了。g修飾符表示全局匹配(global),加上它以后,正則對象將匹配全部符合條件的結果,主要用于搜索和替換。

var regex = /x/g; //有g修飾符
var ss = 'x_x_x_x_';
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 1
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 3
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 5
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 7
console.log(regex.test(ss)); //檢索結果 false

var regex = /x/; //無g修飾符
var ss = 'x_x_x_x_';
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true
console.log(regex.lastIndex) //輸出當前從哪一位開始檢索 0
console.log(regex.test(ss)); //檢索結果 true

帶有g修飾符時,可以通過正則對象的lastIndex屬性指定開始搜索的位置。

//修飾符g下可以修改lastIndex
var regex = /x/g;
var ss = 'x_x_x_x_'
regex.lastIndex = 7;//從第七個開始尋找
console.log(regex.test(ss));//查找不到false
  • m修飾符

表示多行模式(multiline),會修改和$的行為。默認情況下(即不加m修飾符時),和$匹配字符串的開始處和結尾處,加上m修飾符以后,和$還會匹配行首和行尾,即和$會識別換行符(\n)。

2.1 每個修飾符都對應相應的屬性

regex.ignoreCase; //是否忽略大小寫
regex.lastIndex // 正則對象的lastIndex屬性不僅可讀,還可寫。一旦手動設置了lastIndex的值,就會從指定位置開始匹配。但是,這只在設置了g修飾符的情況下,才會有效。
regex.source // "abc" 返回正則表達式的字符串形式(不包括反斜杠),該屬性只讀。

3.常用字符

正則表達式中那些有特殊含義的字符,如果要匹配它們本身,就需要在它們前面要加上反斜杠。比如要匹配加號,就要寫成\+。正則模式中,需要用斜杠轉義的,一共有12個字符:^、.、[、$、(、)、|、*、+、?、{和\\

3.1開始結束字符

位置字符用來提示字符所處的位置,主要有兩個字符。

  • ^ 表示字符串的開始位置
  • $ 表示字符串的結束位置
// test必須出現在開始位置
/^test/.test('test123') // true
// test必須出現在結束位置
/test$/.test('new test') // true
// 從開始位置到結束位置只有
test/^test$/.test('test') // true/^test$/.test('test test') // false

3.2或關系字符

豎線符號(|)在正則表達式中表示“或關系”(OR),即cat|dog表示匹配cat或dog。

/11|22/.test('911') // true

3.3類字符[]

表示有一系列字符可供選擇,只要匹配其中一個就可以了。所有可供選擇的字符都放在方括號內,比如[xyz] 表示x、y、z之中任選一個匹配。 下面代碼表示,字符串“hello world”不包含a、b、c這三個字母中的任一個,而字符串“apple”包含字母a。

/[^abc]/.test('hello world') // true
/[^abc]/.test('bbc') // false
[0-9.,] //表示匹配是否包含0-9或'.'或','
[0-9a-fA-F] //表示匹配是否包含0-9或a-f或A-F
[a-zA-Z0-9-] //表示匹配是否包含a-z或A-Z或0-9或'-'
[1-31] //表示匹配是否包含0-3或'1'

3.4預定義模式

預定義模式指的是某些常見模式的簡寫方式。

  • \d 匹配0-9之間的任一數字,相當于[0-9]。
  • \D 匹配所有0-9以外的字符,相當于[^0-9]。
  • \w 匹配任意的字母、數字和下劃線,相當于[A-Za-z0-9_]。
  • \W 除所有字母、數字和下劃線以外的字符,相當于[^A-Za-z0-9_]。
  • \s 匹配空格(包括制表符、空格符、斷行符等),相等于[\t\r\n\v\f]。
  • \S 匹配非空格的字符,相當于[^\t\r\n\v\f]。
  • \b 匹配詞的邊界。
  • \B 匹配非詞邊界,即在詞的內部。

3.5模式的精確匹配次數

模式的精確匹配次數,使用大括號({})表示。{n}表示恰好重復n次,{n,}表示至少重復n次,{n,m}表示重復不少于n次,不多于m次

/lo{2}k/.test('look') // true
/lo{2, 5}k/.test('looook') // true

量詞符用來設定某個模式出現的次數。

  • ? 問號表示某個模式出現0次或1次,等同于{0, 1}。
  • * 星號表示某個模式出現0次或多次,等同于{0,}。
  • + 加號表示某個模式出現1次或多次,等同于{1,}。

3.6貪婪模式與非貪婪模式

?*+三個量詞符,默認情況下都是最大可能匹配,即匹配直到下一個字符不滿足匹配規則為止。這被稱為貪婪模式。

  • 貪婪模式

下面代碼中,模式是/a+/,表示匹配1個a或多個a,那么到底會匹配幾個a呢?因為默認是貪婪模式,會一直匹配到字符a不出現為止,所以匹配結果是3個a。

var s = 'aaa';s.match(/a+/) // ["aaa"]
  • 非貪婪模式

如果想將貪婪模式改為非貪婪模式,可以在量詞符后面加一個問號。

  • *?:表示某個模式出現0次或多次,匹配時采用非貪婪模式。
  • +?:表示某個模式出現1次或多次,匹配時采用非貪婪模式。
//+
var s = 'aaa';s.match(/a+/) // ["aaa"]
var s = 'aaa';s.match(/a+?/) // ["a"]
//*
var s = 'aaa';s.match(/a*/) // ["aaa"]
var s = 'aaa';s.match(/a*?/) // ["a"]

3.7非捕獲組

普通的()表示是一個分組,但會存在不需要返回該組匹配的內容,即匹配的結果中不計入這個括號。

  • (?:x)稱為非捕獲組(Non-capturing group)
var m = 'abc'.match(/(.)b(.)/);// ["abc", "a" , "c"]
var m = 'abc'.match(/(?:.)b(.)/);// ["abc", "c"]

3.8先行斷言與后行斷言

  • 先行斷言

先行斷言指的是,x只有在y前面才匹配,必須寫成/x(?=y)/。比如,只匹配百分號之前的數字,要寫成/\d+(?=%)/。”先行否定斷言“指的是,x只有不在y前面才匹配,必須寫成/x(?!y)/。比如,只匹配不在百分號之前的數字,要寫成/\d+(?!%)/

//整數必須在%前面才匹配
/\d+(?=%)/.exec('100%')  // ["100"]
//整數必須不在%%前面才匹配
/\d+(?!%)/.exec('100%')  // ["10"]
  • 后行斷言

后行斷言正好與先行斷言相反,x只有在y后面才匹配,必須寫成/(?<=y)x/。比如,只匹配美元符號之后的數字,要寫成/(?<=\$)\d+/。”后行否定斷言“則與”先行否定斷言“相反,x只有不在y后面才匹配,必須寫成/(?<!y)x/。比如,只匹配不在美元符號后面的數字,要寫成/(?<!\$)\d+/

//整數必須在$后面才匹配
/(?<=\$)\d+/.exec('$100') // ["100"]
//整數必須不在$后面才匹配
/(?<!\$)\d+/.exec('$100')  // ["00"]

4.正則表達式的exec方法

exec方法可以返回匹配結果。如果發現匹配,就返回一個數組,成員是每一個匹配成功的子字符串,否則返回null。如果正則表示式包含圓括號(即含有“組匹配”),則返回的數組會包括多個成員。第一個成員是整個匹配成功的結果,后面的成員就是圓括號對應的匹配成功的組。也就是說,第二個成員對應第一個括號,第三個成員對應第二個括號,以此類推。整個數組的length屬性等于組匹配的數量再加1。

  • input:整個原字符串。
  • index:整個模式匹配成功的開始位置(從0開始計數)。
//exec方法
//exec匹配成功后返回數組的屬性g修飾符
var r = /a(b+)a/g;
var arr = r.exec('_abbba_aba_');
console.log(arr); // ["abbba", "bbb"]
console.log(arr.index); // 1
console.log(arr.input); // "_abbba_aba_"

var arr = r.exec('_abbba_aba_');
console.log(arr); // ["aba", "b"]
console.log(arr.index); // 7
console.log(arr.input); // "_abbba_aba_"

js String和正則表達式相關的方法

1.字符串對象的match方法

字符串對象的match方法對字符串進行正則匹配,返回匹配結果。 如果正則表達式帶有g修飾符,則該方法與正則對象的exec方法行為不同,會一次性返回所有匹配成功的結果。 設置正則表達式的lastIndex屬性,對match方法無效,匹配總是從字符串的第一個字符開始。

//String的match方法
var ss = 'aabbbaaabaabbbbbbbaabbaccca';
var reg = /a(b+)a/g;
var arr = ss.match(reg);
console.log(arr);//["abbba", "aba", "abbbbbbba", "abba"]

2.字符串對象的replace方法

字符串對象的replace方法可以替換匹配的值。它接受兩個參數,第一個是搜索模式,第二個是替換的內容。有g修飾符會替換全部匹配的。返回值是替換后的結果。replace方法的第二個參數可以使用美元符號$,用來指代所替換的內容。($n只有在正則中有()時才有用,$&表示查找到的整體內容,$n表示的是查找到的內容中的()中的子內容)

  • $& 指代匹配的子字符串。
  • $` 指代匹配結果前面的文本。
  • $' 指代匹配結果后面的文本。
  • $n 指代匹配成功的第n組內容,n是從1開始的自然數。
  • $$ 指代美元符號$。
var s1 = 'hello world';
console.log(s1.replace(/(\w+)\s(\w+)/, '[$&]'));//[hello world]
var s1 = 'hello world';
console.log(s1.replace(/(\w+)\s(\w+)/, '[$1]'));//[hello]
var s1 = 'hello world';
console.log(s1.replace(/(\w+)\s(\w+)/, '[$2]'));//[world]

replace方法的第二個參數還可以是一個函數,將每一個匹配內容替換為函數返回值。g修飾符有效

console.log('3 and 5'.replace(/[0-9]+/, function (match) {
    return 2 * match;
})); //6 and 5
console.log('3 and 5'.replace(/[0-9]+/g, function (match) {
    return 2 * match;
})); //6 and 10

3.字符串對象的split方法

字符串對象的split方法按照正則規則分割字符串,返回一個由分割后的各個部分組成的數組。 該方法接受兩個參數,第一個參數是分隔規則,第二個參數是返回數組的最大成員數。

// 非正則分隔
'a,  b,c, d'.split(',')// [ 'a', '  b', 'c', ' d' ]
// 正則分隔,去除多余的空格
'a,  b,c, d'.split(/, */)// [ 'a', 'b', 'c', 'd' ]
// 指定返回數組的最大成員
'a,  b,c, d'.split(/, */, 2)[ 'a', 'b' ]

如果正則表達式帶有括號,則括號匹配的部分也會作為數組成員返回。

'aaa*a*'.split(/(a*)/)// [ '', 'aaa', '*', 'a', '*' ]
'aaa*a*'.split(/a*/)// [ '', '*' , '*' ]
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容