1. 程式人生 > >正則表示式貪婪與非貪婪模式

正則表示式貪婪與非貪婪模式

之前做程式的時候看到過正則表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。

1.什麼是正則表示式的貪婪與非貪婪匹配

如:String str="abcaxc";

    Patter p="ab.*c";

  貪婪匹配:正則表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字串str,結果就是匹配到:abcaxc(ab.*c)。

  非貪婪匹配:就是匹配到結果就好,就少的匹配字元。如上面使用模式p匹配字串str,結果就是匹配到:abc(ab.*c)。

2.程式設計中如何區分兩種模式

  預設是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。

  量詞:{m,n}:m到n個

     *:任意多個

     +:一個到多個

     ?:0或一個

3.程式例項

使用Snort的規則一條規則的一部分作為匹配文字,匹配出其中的content部分。

複製程式碼
 1 import java.util.regex.Matcher;
 2 import java.util.regex.Pattern;
 3 
 4 public class RegularTest {
 5     
 6     public static void main(String[] arg){
 7         String text="(content:\"rcpt to root\";pcre:\"word\";)";
8 String rule1="content:\".+\""; //貪婪模式 9 String rule2="content:\".+?\""; //非貪婪模式 10 11 System.out.println("文字:"+text); 12 System.out.println("貪婪模式:"+rule1); 13 Pattern p1 =Pattern.compile(rule1); 14 Matcher m1 = p1.matcher(text); 15 while
(m1.find()){ 16 System.out.println("匹配結果:"+m1.group(0)); 17 } 18 19 System.out.println("非貪婪模式:"+rule2); 20 Pattern p2 =Pattern.compile(rule2); 21 Matcher m2 = p2.matcher(text); 22 while(m2.find()){ 23 System.out.println("匹配結果:"+m2.group(0)); 24 } 25 } 26 }
複製程式碼

執行結果:

 4.注意

  在linux C 下面沒有編譯成功使用?號的非貪婪模式。

   網上的一句話:the ? only works for Perl-based regexp, not for POSIX...

相關推薦

關於表示式數量詞的貪婪貪婪模式

在匹配正則的時候或許會遇到返回的結果多幾個字元或者少幾個字元,什麼原因呢,這個就是正則的貪婪與非貪婪模式,假設,我的匹配字元是: a = 'asdf444adfadf   adfsadf' 正則表示式的貪婪模式: [a-z]{2,6} 列印結果 ['asdf',

python表示式貪婪貪婪模式

之前做程式的時候看到過正則表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。 1.什麼是正則表示式的貪婪與非貪婪匹配   如:String str="abcaxc";     Patter p="ab.*c";   貪婪匹配:正則表示式一般趨向於最大長度匹配,

表示式貪婪貪婪模式

之前做程式的時候看到過正則表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。 1.什麼是正則表示式的貪婪與非貪婪匹配 如:String str="abcaxc";     Patter p="ab.*c";   貪婪匹配:正則表示式一般趨向於最大長度匹配,也就是所謂

表示式貪婪貪婪模式(II)

貪婪模式 正則表示式在匹配的時候會盡可能多的匹配,直至匹配失敗 如: '123456789'.replace(/\d{3,7}/g,'X') 結果: "X89" 非貪婪模式 讓正

[轉] 表示式貪婪貪婪模式

今天使用Notepad++時發現搜尋時需要正則匹配,到網上搜了下Notepad++中正則的用法,發現有個加+號是非貪婪匹配的東西,不太記得了,故到網上搜索,發現有用部落格一份: 之前做程式的時候看到過正則表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。 1.什麼

表示式之--貪婪貪婪模式詳解

“.*”取得控制權後,由A後面的位置開始嘗試匹配,由於是貪婪模式,優化嘗試匹配,一直匹配到字串的結束位置,將控制權交給“"”。“"”取得控制權後,由於已經是字串的結束位置,匹配失敗,查詢可供回溯的狀態,將控制權交給“.*”,由“.*”讓出已匹配字元“.”。重複以上過程,直到後面“"”匹配了C處後面的字元“””

表示式貪婪貪婪模式

<script> try{ str="<p>abcdefg</p><p>abcdefghijkl</p>"; re1=str.match(/<p>[\W\w]+?<\/p>/ig); al

JS表示式:量詞的貪婪模式惰性模式的區別

在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎: 1.寫法法基礎: regexObj.test(str);例如/123/.test(‘123’); 2.基本語法 錨點:匹配一個位置 ^表示起始位置;/^a/.test(‘str’);表示是否以a開頭

表示式貪婪貪婪

var s='120000|天津市,130000|河北省,210000|遼寧省,220000|吉林省,310000|上海市,320000|江蘇省,330000|浙江省,'; var r = /310000/|(.*?)(?:,)/ r.exec(s); s.match(

[ 轉載 ] 什麽是表達式的貪婪貪婪匹配

blog 環視 北京市 正則表達式 clas 第一個 pat exp com http://www.cnblogs.com/xudong-bupt/p/3586889.html 1.什麽是正則表達式的貪婪與非貪婪匹配 如:String str="abcaxc"; Patte

表示式詳解(貪婪懶惰、前瞻後顧、後向引用等)

之前嫌正則麻煩,一直沒有深入去了解過正則,能不用的地方就不使用。 最近專案中遇到了不可避免的正則使用,所以花了點時間去了解並整理了一下,理解不一定完全準確,如有不對歡迎指出,希望對大家有所幫助。 一、名詞解釋 首先我們瞭解幾個名詞:元字元 、 普通字元、列印字元、非列印字元、 限定符 、定位符、非列

表示式的懶惰和貪婪模式

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

表達式:貪婪貪婪

move www emp echo 無法 rem 但是 耗資源 loaded 前言 在一段時間內,一直不知道.*和.*?之間的區別,一直單純的覺得兩者之間並沒有什麽區別,都是匹配任意字符,知道今天才知道其中的區別 簡要介紹 首先從一個簡單的問題的問題開始思考: 有這樣一個字

表示式實現

我們先虛擬兩個表示式PatternA和PatternB,分別校驗條件A和條件B 一 匹配字元串同時滿足條件A和條件B (?=PatternA)PatternB 二 匹配字串滿足條件A,但不可滿足條件B (?!PatternB)PatternA 三 匹配字串或者滿

Scala中表示式以及模式匹配結合

正則表示式 //"""原生表達 val regex="""([0-9]+)([a-z]+)""".r val numPattern="[0-9]+".r val numberPattern="""\s+[0-9]+\s+""

爬蟲第一課:表示式符號方法

第一課:正則表示式符號與方法 1. . :匹配任意字元,換行符除外: >>> import re >>> a='xy123' >>> b=re.findall('x',a) >>> b ['x'] >

表示式定義建立

字串是我們在程式設計中涉及到的非常多的一種資料結構,涉及到很多的字串的方法操作,同樣判斷一個字串是否滿足某種格式是我們會場遇到的問題,比如驗證郵件手機密碼等字串格式。我們可以利用正則表示式來處理。設計思想是用一種描述性的語言來給字串定義一個規則,凡是符合規則的字串,我們就認為它“匹配”了,否則,該字串就是

表示式字元量詞

1、元字元 正如之前我們所提到的匹配手機號規則,正則表示式中的所有字母和數字都是按照字面含義進行匹配的。同樣js中的正則表示式語法也支援非字母的字元匹配,這些字元需要通過反斜線(\)作為字首去轉義。比如上文提到的\d就是用來匹配查詢數字。   2、特殊字元

Java表示式學習記錄

轉載自:http://www.runoob.com/java/java-regular-expressions.html 正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。 1、正則表示式中字元意義: \            將下一字元標

網路爬蟲筆記【6】 Python 中的表示式模組應用

python3 內建的 re 模組,包含了正則表示式的操作集。 re 模組的一般使用步驟如下: 編譯正則表示式,即使用 compile() 函式將正則表示式的字串形式編譯為一個 Pattern 物件。 對目標字串進行匹配,即通過 Pattern 物件提供的一些列方法對文字