`

正则表达式学习笔记(4) 贪婪、惰性和支配量词

阅读更多
原帖地址
http://www.blogjava.net/ycyk168/archive/2009/01/07/250323.html
引用

贪婪量词:
先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么    再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。

惰性量词:
先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。

支配量词:
只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。

贪婪量词   惰性量词    支配量词                      描述
-------------------------------------------------------------------------------------
  ?             ??             ?+                      可以出现0次或1次,但至多出现1次
  *             *?            *+                      可以出现任意次,也可以不出现
  +             +?            ++                      出现1次或多次,但至少出现1次
  {n}        {n}?           {n}+                   一定出现n次
  {n,m}    {n,m}?       {n,m}+               至少出现n次,但至多不能超过m次
  {n,}       {n,}?          {n,}+                 可以出现任意次,但至少出现n次

例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配
1、贪婪量词
1        var regexp = /.*bbb/g;
2        var a = str.match(regexp);
3        alert(a.length);   //output:1
4        alert(a[0]);       //output:abbbaabbbaaabbb

贪婪量词的工作过程可以这样表示:
  a)abbbaabbbaaabbb1234
  b)abbbaabbbaaabbb123
  c)abbbaabbbaaabbb12
  d)abbbaabbbaaabbb1
  e)abbbaabbbaaabbb //true
  可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词
1        var regexp = /.*?bbb/g;
2        var a = str.match(regexp);
3        alert(a.length);   //output:3
4        alert(a[0]);       //output:abbb
5        alert(a[1]);       //output:aabbb
6        alert(a[2]);       //output:aaabbb

惰性量词的工作过程可以这样表示:
  a)a
  b)ab
  c)abb
  d)abbb //保存结果,并从下一个位置重新开始
 
  e)a
  f)aa
  g)aab
  h)aabb
  j)aabbb //保存结果,并从下一个位置重新开始
 
  e)a
  e)aa
  e)aaa
  e)aaab
  e)aaabb
  e)aaabbb  //保存结果,并从下一个位置重新开始

由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:
1        String string = "abbbaabbbaaabbb1234";
2        Pattern p = Pattern.compile(".*+bbb");
3        Matcher m = p.matcher(string);
4        System.out.println(m.find());   //output:false
5

因为支配量词采用一刀切的匹配方式,如:
  a)abbbaabbbaaabbb1234 //false
分享到:
评论

相关推荐

    java正则表达式学习笔记

    以上列举了一些常见的正则表达式应用场景及其匹配规则,可以帮助开发者更好地理解和掌握Java正则表达式的使用技巧。通过这些示例,我们可以看到正则表达式在实际开发中的强大作用,并且能够灵活应用于各种复杂的字符...

    javascript正则表达式学习笔记

    这篇学习笔记将深入探讨JavaScript正则表达式的概念、语法和实际应用。 一、正则表达式基础 1. 创建正则表达式: - 字面量表示法:`/pattern/flags` - 构造函数:`new RegExp('pattern', 'flags')` 2. 常见的...

    正则表达式转换工具

    - 工具支持:利用在线正则表达式测试网站,如Regex101,进行实时调试和学习。 综上所述,"正则表达式转换工具"是处理文本数据的强大辅助,它简化了正则表达式的构造过程,使得非专业人士也能方便地利用正则表达式...

    C语言正则表达式库

    1. **语法兼容性**:如描述所述,PCRE库的正则表达式语法与Perl语言高度兼容,这意味着开发者可以利用Perl中广泛使用的正则表达式语法,如贪婪和非贪婪量词、分支选择、反向引用等。 2. **Unicode支持**:PCRE库...

    pb 使用正则表达式源码pbregexp

    描述中提到的“pb中使用正则表达式组件,通过该组件可以在pb脚本中使用功能强大的正则表达式”,强调了pbregexp组件的强大功能,意味着它可能支持丰富的正则表达式语法,如量词(*、+、?)、字符类、预定义字符集、...

    正则表达式学习资料以及练习项目代码很多

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。在Python编程语言中,正则表达式提供了强大的文本处理能力,使得开发者能够高效地处理...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本...通过深入研究这个C#版的正则表达式测试工具源码,开发者不仅可以巩固正则表达式的基础知识,还可以提升在C#环境中应用正则表达式的能力,同时学习到UI设计和事件处理等方面的实践技巧。

    正则表达式全解及正则表达式学习心得

    正则表达式全解及正则表达式学习心得 正则表达式是字符串模式匹配的强大工具,掌握正则表达式可以让开发者更方便地处理字符串数据。本文将对正则表达式的基本概念、元字符、模式匹配、量词、分组、字符类、边界匹配...

    关于js正则表达式学习笔记(自己整理的)

    以下是对正则表达式的基础知识和常见用法的详细解析: 1. **基本结构**: 正则表达式通常由模式和修饰符组成。模式定义了要匹配的字符序列,而修饰符则影响匹配的方式。例如,`/pattern/flags`,其中`pattern`是...

    正则表达式学习视频

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。本视频教程将全面覆盖正则表达式的基础与高级用法,并结合JavaScript和Java这两种常见...

    正则表达式学习笔记小结分享

    学习正则表达式虽然初看可能较为复杂,但掌握基本的语法和常用元字符、量词,结合实际应用中的例子,可以逐步提高理解和运用能力。使用在线调试工具,如 regex101.com 和 regexr.com,可以帮助我们实时测试和调试...

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    正则表达式笔记归纳

    正则表达式由一系列字符和特殊符号组成,用以匹配字符串中的特定模式。下面是一些基本的语法元素: 1. **字面量**:直接匹配一个或多个字符。 - 示例:`/xx/` 表示匹配字符串“xx”。 2. **转义字符**:用于匹配...

    正则表达式速查 正则表达式举例 正则表达式学习

    ### 正则表达式基础知识与应用详解 #### 一、正则表达式简介 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助我们完成...希望本文能够帮助读者更好地理解和掌握正则表达式的核心概念和使用技巧。

    正则表达式学习书PDF

    这本书通常会深入浅出地介绍正则表达式的概念和用法,包括基本字符类(如字母、数字、空白符)、量词(如*、+、?、{n,m}表示重复次数)、选择符(|表示或)、分组(()用于组合和提取子匹配)、断言(^、$表示开始和...

    正则表达式.rar正则表达式.rar正则表达式.rar正则表达式.rar正则表达式.rar

    正则表达式的概念源于理论计算机科学,它由一系列元字符和量词组成。元字符是具有特殊含义的字符,如`.`代表任意字符,`^`表示行首,`$`表示行尾,`*`表示前面的字符重复零次或多次。量词如`+`、`?`、`{n}`、`{n,}`...

    正则表达式学习手册

    ### 正则表达式学习手册知识点总结 ...通过以上总结可以看出,正则表达式的学习不仅限于基础的概念和规则,还需要进一步了解其高级应用。对于新手而言,建议从简单入手逐步深入,不断实践以提高熟练度。

    正则表达式学习资料整理

    总的来说,"正则表达式学习资料整理"中的四则运算正则表达式部分,旨在帮助学习者掌握如何运用正则表达式来处理数学运算符,以及理解正则表达式的基本语法和原理,从而在实际编程中更加得心应手。通过深入学习和实践...

    正则表达式学习工具

    本“正则表达式学习工具”是专为C#初学者和开发者设计的,旨在提供一个方便的环境来学习和测试正则表达式。 首先,我们来了解C#中的正则表达式基础。C#中的正则表达式操作主要通过`System.Text.RegularExpressions`...

Global site tag (gtag.js) - Google Analytics