1. 程式人生 > 實用技巧 >js正則表示式(.+)和(.+?)的區別

js正則表示式(.+)和(.+?)的區別

原文連結:https://www.cnblogs.com/yalong/p/14101587.html

js正則表示式(.+)和(.+?)的區別:

  (.+)預設是貪婪匹配   (.+?)為惰性匹配

相關知識介紹:

1. 匹配任意字元用 .

萬用字元 . 作為任何字元的佔位符 (數量為1)
// To match "cat", "BAT", "fAT", "mat"
const regexWithWildcard = /.at/gi;
const testString = "bbcat BAT cupcake fAT mat dog";
const allMatchingWords = testString.match(regexWithWildcard);
// ["cat", "BAT", "fAT", "mat"] 

2. 萬用字元 . 需要和 * 區分開

匹配連續出現零次或多次的字元, 使用星號 *, * 是用來限制出現的次數的
const zeroOrMoreOsRegex = /hi*/gi;
const normalHi = "hi";
const happyHi = "hiiiiii";
const twoHis = "hiihii";
const bye = "bye";
 
normalHi.match(zeroOrMoreOsRegex); // ["hi"]
happyHi.match(zeroOrMoreOsRegex); // ["hiiiiii"]
twoHis.match(zeroOrMoreOsRegex); // ["hii", "hii"]
bye.match(zeroOrMoreOsRegex); // null

3.匹配一行中出現一次或多次的字元, 使用 +

const oneOrMoreAsRegex = /a+/gi;
const oneOrMoreSsRegex = /s+/gi;
const cityInFlorida = "Tallahassee";
 
cityInFlorida.match(oneOrMoreAsRegex); // ['a', 'a', 'a'];
cityInFlorida.match(oneOrMoreSsRegex); // ['ss'];  

4.惰性匹配

  • 字串中與給定要求匹配的最小部分
  • 預設情況下,正則表示式是貪婪的(匹配滿足給定要求的字串的最長部分)
  • 使用?阻止貪婪模式 變為惰性匹配
const testString = "catastrophe";
const greedyRexex = /c[a-z]*t/gi;
const lazyRegex = /c[a-z]*?t/gi;
testString.match(greedyRexex); // ["catast"]
testString.match(lazyRegex); // ["cat"]

具體分析:

1.貪婪匹配是先看整個字串是否匹配,如果不匹配,它會去掉字串的最後一個字元,並再次嘗試,如果還不匹配,那麼再去掉當前最後一個,直到發現匹配或不剩任何字元。

var str='abcdabceba'

/.+b/ 匹配一個或多個任意字元後面跟一個字母b

執行str.match(/.+b/) // 匹配到abcdabceb

第一次(先看整個字串是否是一個匹配) abcdabceba 不匹配,然後去掉最後一個字元a

第二次(去掉最後一個字元後再匹配) abcdabceb 匹配,返回abcdabceb。

2.惰性匹配是從左側第一個字元開始向右匹配, 先看第一個字元是不是一個匹配, 如果不匹配就加入下一個字元再嘗式匹配, 直到發現匹配

var str='abcdabceba'

/.+?b/ 匹配一個或多個任意字元後面跟一個字母b

執行str.match(/.+?b/) // 匹配到ab

第一次(讀入左側第一個字元) a 不匹配加一個再式

第二次 ab 匹配,返回ab

案例演示

案例一

var str = 'aaa<div style="font-color:red;">123456</div>bbb'

// <.+?>會匹配<div style="font-color:red;">

// <.+>會匹配<div style="font-color:red;">123456</div>

console.log(str.match(/<.+?>/)[0])

// 輸出為: <div style="font-color:red;">

console.log(str.match(/<.+>/)[0])

// 輸出為: <div style="font-color:red;">123456</div>

案例二

let str = 'hello {{ text }}-{{err}}look me!'

str.split(/({{.+?}})/g)

//輸出為:  ["hello ", "{{ text }}", "-", "{{err}}", "look me!"]

let str2 =  'hello {{ text }}-{{err}}look me!'

str2.split(/({{.+}})/g)

// 輸出為: ["hello ", "{{ text }}-{{err}}", "look me!"]