正則表達式貪婪模式和非貪婪模式詳解

一、正則表達式貪婪和非貪婪區別

正則表達式中的貪婪模式是指正則表達式在匹配字符串的過程中,儘可能多地匹配字符,而非貪婪模式則相反,它儘可能少的匹配字符。

以下是一個小例子,對於字符串 “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/zh-hant/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
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論