一、正则表达式贪婪和非贪婪区别
正则表达式中的贪婪模式是指正则表达式在匹配字符串的过程中,尽可能多地匹配字符,而非贪婪模式则相反,它尽可能少的匹配字符。
以下是一个小例子,对于字符串 "abc \d{3,5}? def \d{3,5} ghi",我们想要匹配其中的数字:
var str = "abc 12345 def 678910 ghi"
var reg1 = /\d{3,5}/g
var reg2 = /\d{3,5}?/g
console.log(str.match(reg1)) // ["12345", "67891"]
console.log(str.match(reg2)) // ["123", "456", "789", "10"]
可以看出,使用贪婪模式的正则表达式匹配到的数字是尽可能多的,而使用非贪婪模式的则是尽可能少的。
二、正则表达式非贪婪模式
在正则表达式中,使用 "?" 可以将其后面的量词标记为非贪婪模式,例如上面的例子:
var reg = /\d{3,5}?/g
其中 "?“ 将贪婪模式改为了非贪婪模式。
非贪婪模式与贪婪模式不同,其将尽可能少的匹配字符,例如:对于字符串 "abc 12345 def 678910 ghi",使用非贪婪模式匹配数字,则会尽可能的少匹配数字,结果是每次匹配了3位数字。
三、js正则表达式贪婪模式
在 JavaScript 中,默认的正则表达式使用的是贪婪模式,也就是说,不需要使用 "?" 来设置非贪婪模式。例如:
var str = "abc 12345 def 678910 ghi"
var reg = /\d{3,5}/g
console.log(str.match(reg)) // ["12345", "678910"]
可以看到,使用 /\d{3,5}/g 正则表达式匹配到的数字是尽可能多的。
四、正则表达式贪婪和非贪婪
正则表达式贪婪模式和非贪婪模式的使用取决于需求,对于某些需要匹配尽可能多字符的情况可以使用贪婪模式,然而在某些情况下尽可能少的匹配字符可能会更加符合要求,此时可使用非贪婪模式。
以下是一个常见的例子,需要匹配一个 HTML 标签中的内容:
var str = "<div><p>Hello</p></div>"
var reg1 = /<.+>/g
var reg2 = /<.+?>/g
console.log(str.match(reg1)) // ["<div><p>Hello</p></div>"]
console.log(str.match(reg2)) // ["<div>", "<p>", "</p>", "</div>"]
由于贪婪模式尽可能多的匹配字符,在这个例子中,使用 reg1 正则表达式匹配到的是整个 div 标签加上其中的内容,而使用 reg2 则是匹配到标签中的每一个部分。所以在某些情况下,使用非贪婪模式会更加符合需求。
五、正则表达式中的非贪婪模式
正则表达式中的非贪婪模式可以用 "?" 号来实现,例如 ".+?"。这样表示非贪婪模式,正则表达式在匹配字符串的时候尽可能少的匹配字符。
以下是一个例子,需要将一段 HTML 代码中的标签全部替换成 "abc":
var str = "<div><p>Hello</p></div>"
var reg = /<.+?>/g
console.log(str.replace(reg, "abc")) // "abcabc"
由于使用了非贪婪模式,".+?" 会尽可能少的匹配字符,因此只会将标签替换成一个"abc"。
六、正则表达式贪婪与非贪婪模式区别
正则表达式贪婪模式尽可能多的匹配字符,适用于需要匹配尽可能多字符的情况。而非贪婪模式则尽可能少的匹配字符,适用于需要匹配最短字符串的情况。
我们来看一个简单的例子,需要匹配字符串中的字母:
var str = "abcde"
var reg1 = /.+/
var reg2 = /.+?/
console.log(str.match(reg1)) // ["abcde"]
console.log(str.match(reg2)) // ["a"]
可以看出,使用贪婪模式的正则表达式匹配到的是整个字符串,而使用非贪婪模式则只匹配到了第一个字符。