在看js代碼的時候,有時候會遇到 .*? 這樣的寫法,那麼連續兩個限制符是什麼意思呢?我們先來回顧一下正則表達式的基本知識。
基本語法
符號 | 用法 |
---|---|
. | 匹配除“\r\n”之外的任何單個字符。要匹配包括“\r\n”在內的任何字符,請使用像“[\s\S]”的模式。 |
? | 匹配前面的子表達式0到1次 |
* | 匹配前面的子表達式人任意次 |
+ | 匹配前面的子表達式一次或多次(大於等於1次) |
懶惰匹配
表達式 .* 的意思很好理解,就是單個字符匹配任意次,即貪婪匹配。
表達式 .*? 是滿足條件的情況只匹配一次,即懶惰匹配
這是什麼 意思?我們用例子來解釋。
var str = 'Anna is {age} years old,Bob is {age} years old too';
var expr = /{.*?}/g;
console.log(str.replace(expr, '13'));
命令行輸出: Anna is 13 years old,Bob is 13 years old too
可以看出,懶惰模式下,只要滿足條件,就不再向後匹配,以下是貪婪模式:
var str = 'Anna is {age} years old,Bob is {age} years old too';
var expr = /{.*}/g;
console.log(str.replace(expr, '13'));
命令行輸出: Anna is 13 years old too
中間所有滿足條件的都被替換了
注意
像 .+* 以及 .*+這種表達式是錯誤的,命令行會報錯。如果希望貪婪匹配,直接 .* 或者 .+就可以