1. 程式人生 > >正則表示式之最短匹配

正則表示式之最短匹配

貪婪與懶惰

當正則表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配儘可能多的字元。考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配儘可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上一個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)

ab(第四到第五個字元)

為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為正則表示式有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。

表5.懶惰限定符
程式碼/語法說明
*?重複任意次,但儘可能少重複
+?重複1次或更多次,但儘可能少重複
??重複0次或1次,但儘可能少重複
{n,m}?重複n到m次,但儘可能少重複
{n,}?重複n次以上,但儘可能少重複
https://blog.csdn.net/liliflashfly/article/details/5331685

相關推薦

表示式匹配

貪婪與懶惰當正則表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配儘可能多的字元。考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。有時,我們更需

javascript表示式匹配(貪婪匹配)和匹配(懶惰匹配

最近在閱讀RequireJS 2.1.15原始碼,原始碼開始處定義了一系列的變數,有4個正則表示式: var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)

Python學習筆記模式匹配表示式使用和不使用表示式

 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線-------------------------------------------   假設你希望在字串中查詢電話號碼。你知道模式:3個數字,一

Nginx表示式匹配操作符詳解

Nginx正則表示式之匹配操作符詳解 nginx可以在配置檔案中對某些內建變數進行判斷,從而實現某些功能。例如:防止rewrite、盜鏈、對靜態資源設定快取以及瀏覽器限制等等。由於nginx配置中有if指令,但是沒有對應else指令,所以判斷要分為匹配和不匹配。

表示式貪婪匹配與非貪婪匹配

. :匹配除 "\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用像 '[.\n]' 的模式 * :匹配0個或多個 使用 .* 的話就可以匹配任意長度的任意字元,但是有時候在使用 .*時就可能匹配不到物品們想要的結果,例: import re

js表示式人民幣匹配

   人民幣格式匹配   小寫格式:¥ 符號 和 整數值 與小數3部分組成。   (0)程式碼與執行結果   { // 匹配人民幣 let [reg, info, rmb, result] = [ /^(¥)

lua的表示式模式匹配(轉)

原文地址:http://blog.csdn.net/zhangxaochen/article/details/8084396 函式原型 string.find(s, pattern [, init [, plain]] )  s: 源字串  pattern: 待搜尋模式

python3進階表示式re模組分組(group)、貪心匹配、編譯

  除了簡單地判斷是否匹配之外,正則表示式還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345'

python核心程式設計-表示式-匹配多個字串

#!/usr/bin/env python # -*- coding: UTF-8 -*- import re bt = 'bat|bet|bit' m = re.match(bt,'bat') i

表示式Java匹配指定漢字

           學習了正則表示式後,感覺正則表示式很強大,但是為了更好地理解正則表示式,找了一個很實際的問題來分享一下自己學習的心得。本題目是招聘時的一個題目,題目大致的意思是這樣的:使用者每次

nginx rewrite子組匹配到$9

spl html splay erb ice line display and 需要 nginx rewrite正則匹配()匹配子組最多匹配到$9,就是從$0到$9 當需要匹配更多子組時,可通過變量來實現 if ($uri ~ ^/forum-15/sortid-74/(.

表示式C程式中使用

POSIX規定了正則表示式的C語言庫函式,詳見regex(3)。我們已經學習了很多C語言庫函式的用法,讀者應該具備自己看懂man手冊的能力了。本章介紹了正則表示式在grep、sed、awk中的用法,學習要能夠舉一反三,請讀者根據regex(3)自己總結正則表示式在C語言中的用法,寫一些簡單的程式,例

JS表示式--?:

使用形如(?:pattern)的正則就可以避免儲存括號內的匹配結果。 ?:匹配冒號後的內容但是不獲取匹配結果;不進行儲存供以後使用  下面這個正則是為了實現只匹配以b或者c開頭的字串,一直匹配到換行字元,但是。可以使用“\1”來反向引用這個括號裡的子 正則表示式所匹配的內容。而且exec方法也會

js表示式match函式

功能:使用正則表示式模式對字串執行查詢,並將包含查詢的結果作為陣列返回  函式格式:stringObj.match(rgExp) stringObj為字串必選 rgExp為正則表示式必選項  返回值:如果能匹配則返回結果陣列,如果不能匹配返回null  使用方法:&nb

表示式快速入門篇

前言 此篇隨筆,參考了鼎鼎大名的《正則表示式30分鐘入門》,原帖地址:http://deerchao.net/tutorials/regex/regex.htm 建議初學者可以玩玩正則表示式圖解網站和表示式測試網站,可以更加直觀的瞭解自己書寫的正則表示式結構和作用。他們分別是 圖解網站 

手把手教你搞懂JavaScript表示式方法

咱們來看看JavaScript中都有哪些操作正則的方法。 RegExp RegExp 是正則表示式的建構函式。 使用建構函式建立正則表示式有多種寫法: new RegExp('abc'); // /abc/ new RegExp('abc', 'gi'); // /abc/gi

表示式零寬斷言

正則表示式之零寬斷言 用於查詢在某些內容(但並不包括這些內容)之前或之後的東西 零寬度正預測先行斷言 - (?=exp) 匹配exp前面的位置 正則表示式:.+(?=://) 原始字串:http://localhost:8080/awesome-g

JavaScript表示式語法--詼諧易懂

正則表示式可以用來做表單校驗,也可以用來搜尋關鍵字,匹配字元等等,功能非常強大,但是剛開始看到正則的語法就頭大,什麼程式碼,明明亂碼好嘛?! 但是這麼好用的東西怎麼能不學習,偶然看到師父轉發的文章,簡直讓我這初學者醍醐灌頂,作者講的很通俗易懂。 在文章開始前,要了解es6字串操作方法

表示式:.*?

s = ‘abababababab’ pattern = re.compile(r'a.*b') 那麼檢索到的字串為‘abababababab’,該方法為貪婪匹配,找最長的 pattern = re.compile(r'a.*?b') 加了問號之後預設找最短的 輸出就是6個'ab

linux 表示式grep

正則表示式就是處理字串的方法,可以執行查詢,刪除,替換等特定字元處理程式。 常用命令 grep ,awk ,sed [: alunm:] 代表英文大小寫字元及數字 即0-9 A-Z a-z [: alpha:] 代表任何英文大小寫字元 A-Z