您的位置:

正则表达式贪婪模式和非贪婪模式详解

一、正则表达式贪婪和非贪婪区别

正则表达式中的贪婪模式是指正则表达式在匹配字符串的过程中,尽可能多地匹配字符,而非贪婪模式则相反,它尽可能少的匹配字符。

以下是一个小例子,对于字符串 "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"]

可以看出,使用贪婪模式的正则表达式匹配到的是整个字符串,而使用非贪婪模式则只匹配到了第一个字符。