`

javascript正则表达式贪婪和惰性量词详解和实例

阅读更多

正则表达式中量词有下面六种:

?表示0次或1次

* 表示0次或0次以上

+ 表示1次活1次以上

{n} 表示正好n次

{n,m} 表示n-m次

{n,}表示n次以上

 

 

简单的应用上面的还是很简单的。例如:

var str = "bad bbad";

var patt = /b?a\w*/g;

console.log(str.match(patt))

 

得到结果:["bad", "bad"]

其他的类似。下面看贪婪的、惰性的和支配性的量词。下面是对这些的解释:

贪婪的                    惰性的                        支配性的                      描述

 ?                         ??                         ?+                        表示0次或1次

 *                          *?                            *+                        表示0次或0次以上

 +                          +?                            ++                        表示1次活1次以上

 {n}                        {n}?                          {n}+                      表示正好n次

{n,m}                       {n,m}?                        {n,m}+                    表示n-m次

{n,}                        {n,}?                         {n,}+                     表示n次以上

 

有一个好的方法记忆就是后面什么都没跟的就是贪婪的,跟一个"?"的是惰性的,跟一个"+"的是支配性的。浏览器对支配性的不是很好,IE和Firef和Ghrome都不支持

都会出现错误。下面看实例

var str = "abbbaabbbaaabbb1234";

var patt1 = /.*bbb/g;   //贪婪的   得到结果 ["abbbaabbbaaabbb"]

var patt2 = /.*?bbb/g;  //惰性的   得到结果 ["abbb", "aabbb", "aaabbb"]

try{

var patt3 = /.*\+bbb/g; //支配性的   都不支持,本来是为false的

console.log(str.test(patt3))

}catch(e){

console.log("e")

}

console.log(str.match(patt1))

console.log(str.match(patt2))

 

怎么理解贪婪和惰性,这个从字面上去理解就是贪婪的总是企图要匹配整个字符串,而惰性的只要匹配出结果就行了。一个大的特点是:贪婪的是从字符串后面开始匹配

从后面到前面,如果有匹配的了就再也不匹配了。而惰性的是从前面开始匹配,找到匹配的了。记录下匹配结果,又从下面一个字符开始匹配。直到字符串最后。

再来一个实例:

var str = "<%@ 8%>\n<%header.jsp'%> \n<html> \n<head> \n</head> \n<% r \nInt(10); \n; \n; \n; \n;\n%>\nb"+"\nb\nh\n"

console.log(str)

var patt = /<%([\w\W]*)%>/igm;  //多行匹配  得到结果["<%@ 8%>\n<%header.jsp'%>...Int(10); \n; \n; \n; \n;\n%>"]

var patt = /<%([\w\W]*?)%>/igm;  //多行匹配  得到结果["<%@ 8%>", "<%header.jsp'%>", "<% r \nInt(10); \n; \n; \n; \n;\n%>"]

console.log(str.match(patt));

 

注意上面的patt不能写成这样,var patt = /<%(.*?)%>/igm;  如果是这样那惰性的和贪婪的都得到同样的结果:["<%@ 8%>", "<%header.jsp'%>"]

原因是"."不能匹配换行和回车。在java中创建一个可以通过这样Pattern p = Pattern.compile("<%(.*?)%>", Pattern.DOTALL);创建一个正则表达式,这里的"."是匹配

任意字符的包括换行。


分享到:
评论

相关推荐

    javascript正则表达式迷你书 (1).pdf

    本书是 JavaScript 正则表达式的入门级教程,旨在帮助读者快速掌握正则表达式的基本概念和应用。下面是本书的知识点摘要: 第一章:正则表达式字符匹配攻略 * 两种模糊匹配:横向模糊匹配和纵向模糊匹配 * 字符组...

    JavaScript正则表达式迷你书

    回溯在贪婪量词和惰性量词匹配时会频繁发生,使用分支结构也会引起回溯。 第5章分析了正则表达式的拆分,讨论了结构和操作符、注意要点等,提出了匹配字符串整体问题和量词连缀问题。在编写正则表达式时,需要注意...

    vb正则表达式实例(正则表达式测试程序)

    这个“vb正则表达式实例”很可能是为了帮助开发者测试和理解正则表达式的工作原理而设计的一个应用程序。下面将详细探讨正则表达式的基本概念、在VB.NET中的应用以及如何使用它们进行文本匹配。 1. 正则表达式基础 ...

    javascript正则表达式详解

    此外,正则表达式还支持贪婪匹配和惰性匹配,贪婪匹配尽可能多地匹配字符,而惰性匹配则尽可能少地匹配字符。多选分支则允许在一组中选择任一匹配项。 位置匹配涉及到对字符串的特定位置进行匹配。正则表达式中的...

    javascript正则表达式综合练习

    JavaScript正则表达式是编程语言中的一个重要组成部分,用于处理文本模式匹配和字符串操作。这篇博客“javascript正则表达式综合练习”可能是一个实践教程或示例集合,旨在帮助开发者提升在JavaScript中使用正则...

    pb 使用正则表达式源码pbregexp

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

    javascript正则表达式学习笔记

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

    正则表达式转换工具

    - 文件搜索:在代码编辑器中,使用正则表达式快速查找和替换特定模式的文本。 - 数据清洗:在数据预处理阶段,正则表达式可以帮助剔除无关字符,整理数据格式。 - 网页抓取:在网络爬虫中,正则表达式用于提取...

    JavaScript正则表达式迷你书(1.1版)_程序逻辑_

    正则表达式是JavaScript中一个强大的工具,用于处理文本字符串,进行模式匹配和查找、替换等操作。它们在编程逻辑中扮演着至关重要的角色,尤其是在处理字符串数据时,能够帮助程序员以高效且灵活的方式解决问题。在...

    正则表达式(Deelx版)|正则表达式(Deelx版)支持库

    正则表达式(Deelx版)是一种强大的文本处理工具,它允许程序员和用户通过预定义的模式来匹配、查找、替换或者分析字符串。Deelx版是专门为提高正则表达式性能和功能而设计的一个支持库,适用于各种编程语言和应用场景...

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

    - `Regex`类:这是处理正则表达式的核心类,提供了多种与正则相关的静态方法和实例方法。 - `Match`类:表示正则表达式的一个匹配结果。 - `MatchCollection`类:存储多个匹配结果的集合。 2. **正则表达式语法*...

    java正则表达式.zip

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

    Javascript正则表达式测试网页.rar

    手册“2008628211744.chm”可能包含了这些概念的详细解释和实例,可以帮助学习者逐步掌握JavaScript正则表达式的用法,并通过实际测试网页进行实践。在学习过程中,理解正则表达式的逻辑和结构非常重要,同时,多做...

    C语言正则表达式库

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

    delphi2010 正则表达式实例

    在实际编程中,我们可能需要处理复杂的正则表达式,如量词(*、+、?、{n}、{n,}、{n,m})、字符类([abc]、[^abc])、预查((?=abc)、(?!abc))、后顾引用(\1、\2)等。这些高级特性使得TPerlRegEx能够处理各种复杂...

    正则表达式经典实例

    《正则表达式经典实例》这本书深入浅出地介绍了正则表达式的基本概念和高级特性,并提供了丰富的实例,覆盖了C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等多种编程语言。 #### 二、核心内容概览 1. *...

Global site tag (gtag.js) - Google Analytics