贪婪匹配和非贪婪匹配

1.什么是正则表达式的贪婪与非贪婪匹配

  如:String str="abcaxc";

    Patter p="ab*c";

  贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

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

2.编程中如何区分两种模式

  默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

  量词:{m,n}:m到n个

     *:任意多个

     +:一个到多个

     ?:0或一个

demo

import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class RegularTest {
     
     public static void main(String[] arg){
         String text="(content:\"rcpt to root\";pcre:\"word\";)";
         String rule1="content:\".+\"";    //贪婪模式
         String rule2="content:\".+?\"";    //非贪婪模式
         
         System.out.println("文本:"+text);
         System.out.println("贪婪模式:"+rule1);
         Pattern p1 =Pattern.compile(rule1);
         Matcher m1 = p1.matcher(text);
         while(m1.find()){
             System.out.println("匹配结果:"+m1.group(0));
         }
         
         System.out.println("非贪婪模式:"+rule2);
         Pattern p2 =Pattern.compile(rule2);
         Matcher m2 = p2.matcher(text);
         while(m2.find()){
             System.out.println("匹配结果:"+m2.group(0));
         }
     }
 }

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

string pattern1 = @"a.*c";   // greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"

非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"

几个常用的非贪婪匹配Pattern

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

参考文章:

http://www.cnblogs.com/xudong-bupt/p/3586889.html

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1723247

时间: 2024-11-03 11:17:43

贪婪匹配和非贪婪匹配的相关文章

Delphi中正则表达式语法(6) 贪婪匹配与非贪婪匹配

//贪婪匹配 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '<html><head><title>标题 </title></head><body>内容 </body></html>'; reg.RegEx := '<.*>'; //将会全部匹配, 因为两头分别是: < 和 > reg.R

[正则表达式]贪婪模式与非贪婪模式_正则表达式

复制代码 代码如下: /**     **   author: site120     **   function : get script part from html document     **/     var loadJs = function(str , delayTime)      {          var delayTime = delayTime || 100;          var regExp_scriptTag = new RegExp("<\\s*sc

正则表达式之 贪婪与非贪婪模式详解(概述)_正则表达式

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: "{m,n}"."{m,}"."?"."*"和"+". 在一些使用NFA引擎的语言中,在匹配优先量词后加上"?",即变成属于非

php正则表达式中贪婪与非贪婪介绍_正则表达式

一.贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一. 我们来看看正则里面是怎么贪婪的 <?php $str = '<td>面包一</td><td>面包二</td>'; preg_ma

正则表达式之 贪婪与非贪婪模式详解(概述)

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: "{m,n}"."{m,}"."?"."*"和"+". 在一些使用NFA引擎的语言中,在匹配优先量词后加上"?",即变成属于非

正则表达式效率:贪婪、非贪婪与回溯详解

某同学想过滤 之间的内容,那是这么写正则以及程序的. 1 $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 1 $str = '<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>'; 那么经过上面的程序处理,其结果为 1

小议正则表达式效率 贪婪、非贪婪与回溯_正则表达式

先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. 复制代码 代码如下: $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 复制代码 代码如下: $str = '<script<script>alert(docume

浅谈php正则表达式中的非贪婪模式匹配的使用_php技巧

通常我们会这么写: 复制代码 代码如下: $str = "http://www.baidu/.com?url=www.sina.com/"; preg_match("/http:(.*)com/", $str, $matches); print_r($matches); 结果: 复制代码 代码如下: Array ( [0] => http://www.baidu/.com?url=www.sina.com [1] => //www.baidu/.com?

PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)

先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 $str = '<script<script>alert(document.cookie)</script&