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

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

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

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

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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:27
下一篇 2024-12-12 13:27

相关推荐

  • Python正则表达式search()和match()有什么区别?

    search()和match()都是Python中的正则表达式函数,它们的作用都是在一个字符串中搜索匹配正则表达式的位置,但它们有着不同的使用场景和返回结果。 一、search()…

    编程 2025-04-29
  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • MySQL正则表达式替换

    MySQL正则表达式替换是指通过正则表达式对MySQL中的字符串进行替换。在文本处理方面,正则表达式是一种强大的工具,可以方便快捷地进行字符串处理和匹配。在MySQL中,可以使用正…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论