`

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);创建一个正则表达式,这里的"."是匹配

任意字符的包括换行。


分享到:
评论

相关推荐

    Python正则表达式标准库使用教程.pdf

    正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解...

    精通正则表达式~~~

    第3章:正则表达式的特性和流派概览.... 83 在正则的世界中漫步... 85 正则表达式的起源... 85 最初印象... 91 正则表达式的注意事项和处理方式... 93 集成式处理... 94 程序式处理和面向对象式处理... 95 ...

    [精通正则表达式(第三版)]

    第 1 章 正则表达式入门 29 解决实际问题 30 作为编程语言的正则表达式 32 以文件名做类比 32 以语言做类比 33 正则表达式的思维框架 34 对于有部分经验的读者 34 Egrep元字符 36 行的起始和结束 36 字符组...

    python正则表达式及使用正则表达式的例子

    正则表达式 正则表达用来匹配字符串 正则表达式匹配过程 依次拿出表达式和文本中的字符串进行比价 如果每个字符都能匹配,则匹配成功;一旦有匹配不成功的字符,则匹配失败 如果有量词和边界,则匹配过程稍微有些...

    JavaScript正则表达式的贪婪匹配和非贪婪匹配

    非贪婪匹配就是尽可能少的匹配,用法就是在量词后面加上一个“?”,比如: "aaaaa".match(/a+?/); //["a", index: 0, input: "aaaaa"] 但是非贪婪匹配有时候和我们期待的并不一样,比如: "aaab".match(/a+b/); ...

    正则表达式中包含三种元素分别为:量词、元字符、修饰符正则表达式中包含三种元素分别为:量词、元字符、修饰符

    正则表达式中包含三种元素分别为:量词、元字符、修饰符正则表达式中包含三种元素分别为,这是常用的很有用

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

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的... 从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+

    正则表达式分组实例详解

    正则表达式分组: 如果想匹配3个数字,正则表达式可以用如下写法: \d{3} 以上代码使用重复量词可以匹配3位数字。 但是在实际应用中,往往需要重复多个字符,例如我想重复ab两个字符,使用以下代码就不合适了,代码...

    正则表达式+Python re模块详解

    Python中的re模块提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类...

    48 第二十三回:正则表达式推演千言万语,量词元字符匹配各种文章.mp4

    Python原来这么简单(win系统 提高篇)

    正则表达式教程之模式修正符使用介绍

    之前我们给大家介绍了正则表达式中的定界符、原子和元字符,那么我们关于正则表达式教程的基本语法就剩下了正则表达式中的模式修正符。本节会向大家介绍模式修正符的概念、模式修正符的构成,以及结合实例的模式修正...

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

    先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词,好吧,下面通过实例给大家介绍下PHP 正则表达式效率 贪婪、非贪婪与回溯分析,一起看看吧

    .NET正则表达式基础教程代码

    .NET正则表达式基础使用教程。该文件为Visual Studio 2013项目文件。里面有4个小项目,分别用于介绍正则表达式的字符组,量词,分组,断言。具体请参考我即将推出的博客教程。谢谢各位。

    PHP和正则表达式教程集合之二第1/2页

    正则表达式快速入门(二) 【导读】在本文里,我们主要介绍子模式(subpatterns),逆向引用(Back references)和量词(quantifiers) 在上篇文章里,我们介绍了正则表达式的模式修正符与元字符,细心的读者也许会发现,...

    javascript 进阶篇1 正则表达式,cookie管理,userData

    首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了。...

    正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)

    前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数。有时候,我们可能需要匹配一组多个字符一起出现的次数。这个时候,我们需要分组了。就是用小括号来括起这些字符...

    正则表达式{n,m}量词(至少n次,最多m次)

    正则表达式{n,m}量词: {n,m}量词可以重复前面匹配的字符n-m次,至少n次,最多m次。 语法结构: 构造函数方式: new RegExp("x{n,m}") 对象直接量方式: /x{n,m}/ 浏览器支持: IE浏览器支持此元字符。 火狐浏览器支持...

    Python 正则表达式完整示例教程

    文章目录正则表达式元字符基本元字符:预定义字符使用量词贪婪量词字符分组反向引用分组非捕获分组re模块介绍search()和match()函数match对象的方法findall()和finditer()字符串分割和替换编译正则表达式 正则表达式...

    正则表达式教程

    本教程主要参考自网上最普遍的《正则表达式30分钟入门教程》(http://deerchao.net/tutorials/regex/regex.htm),这是一个非常优秀的教程,深入浅出讲解了正则表达式的基本概念,更加深入的内容可以参考CSDN上过客...

    JS正则表达式常见用法实例详解

    主要介绍了JS正则表达式常见用法,结合实例形式分析了javascript元字符、分组符、修饰符、量词基本含义,并结合具体案例形式分析了javascript正则基本使用技巧,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics