`

关于正则表达式的贪婪与非贪婪模式

阅读更多
原帖:
http://www.cnitblog.com/yemoo/archive/2006/06/22/12675.html
引用

以前看正则表达式,但没有注意到正则表达式的贪婪与非贪婪模式,今天在经典上看到了这么段代码:
<script>
try{
str="<p>abcdefg</p><p>abcdefghijkl</p>";

re1=str.match(/<p>[\W\w]+?<\/p>/ig);
alert("非贪婪模式:\r\n\r\n1:"+re1[0]+"\r\n2:"+re1[1]);

re1=str.match(/<p>[\W\w]+<\/p>/ig);
alert("贪婪模式:\r\n\r\n"+re1);

re1=str.match(/<p>(.+?)<\/p>/i);
alert("非贪婪模式,且不要标记:\r\n\r\n1:"+re1[1]);

re1=str.match(/<p>(.+)<\/p>/i);
alert("贪婪模式,且不要标记:\r\n\r\n"+re1[1]);
}catch(e){alert(e.description)}
</script>

匹配次数中的贪婪与非贪婪

    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

表达式


匹配结果

(d)(\w+)


"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(\w+)(d)


"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

    由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

    非贪婪模式:

    在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式


匹配结果

(d)(\w+?)


"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

(d)(\w+?)(d)


为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

    更多的情况,举例如下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。
分享到:
评论

相关推荐

    正则表达式--递归匹配与非贪婪匹配

    ### 正则表达式——递归匹配与非贪婪匹配 #### 一、递归匹配 在正则表达式中,递归匹配是一个重要的概念,它主要用于处理那些具有嵌套结构的数据,例如数学公式中的括号匹配或HTML标签的匹配。 ##### 1.1 嵌套...

    C语言正则表达式库

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

    java正则表达式.zip

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

    正则表达式大全.docx

    以上给出的正则表达式仅覆盖了一些基础用例,实际的正则表达式可以变得极其复杂,涉及更多的元字符和修饰符,如贪婪与非贪婪匹配、分组、零宽断言等。正则表达式的学习和掌握需要时间和实践,但一旦熟悉,它们将成为...

    正则表达式——贪婪非贪婪模式.rar

    在正则表达式中,贪婪与非贪婪模式是两种不同的匹配方式,它们对如何处理连续重复的字符或字符集有着显著的区别。 首先,我们来了解一下贪婪模式。贪婪模式是正则表达式默认的匹配方式,它会尽可能多地匹配字符。当...

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

    7. **非贪婪匹配**:默认情况下,正则表达式尽可能多地匹配字符,但加上`?`如`.*?`会让匹配尽可能少地进行。 8. **边界匹配**:`\b`匹配单词边界,`\B`匹配非单词边界。 9. **在不同编程语言中的实现**:不同的...

    正则表达式调试工具

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索替换和文本处理等领域。正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将...

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

    - **正则表达式性能优化**:避免过度复杂的正则表达式,合理使用非贪婪匹配,减少回溯。 - **正则表达式调试**:使用`re.DEBUG`标志编译正则表达式,查看其内部结构。 - **正则表达式在其他语言中的差异**:虽然...

    源码(精通正则表达式&实战正则表达式)

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换或提取字符串中的特定模式。本资源“源码(精通正则表达式&实战正则表达式)”专注于JavaScript环境下的正则...

    易语言正则表达式匹配中文

    同时,确保在编写正则表达式时避免无限循环和贪婪匹配,以免导致程序卡死。 综上所述,易语言正则表达式匹配中文涉及了字符串处理、字符编码、正则表达式语法等多个方面。通过学习和掌握这些知识点,开发者可以有效...

    Java正则表达式 Java 正则表达式

    正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中寻找符合该模式的字符串。 1. **基本概念与用途** - 正则表达式主要用途包括字符串匹配、查找和替换。 - ...

    正则表达式基础正则表达式基础

    2. 搜索与替换:在文本编辑器或编程语言中,使用正则表达式可以批量搜索符合特定模式的文本,并进行替换。 3. 文件名或路径过滤:在文件管理中,正则表达式可以用来筛选满足特定规则的文件名或路径。 四、正则...

    C#字符串和正则表达式参考手册

    9. 复杂模式:正则表达式支持更复杂的模式,如贪婪与非贪婪量词`*?`、`+?`、`??`、`{n,}?`等,以及字符类、分组、后向引用等高级特性。 学习和熟练掌握C#中的字符串和正则表达式,能够极大地提升你在处理文本数据时...

    正则表达式客户端工具

    4. 多种匹配模式:除了基本的全局匹配,工具还可能支持多行匹配、贪婪与非贪婪匹配、以及忽略大小写等模式,以满足不同场景下的需求。 5. 查找与替换:正则表达式不仅用于验证,还能用于查找和替换文本。通过正则...

    使用正则表达式拆分字符串

    - 当正则表达式中包含贪婪模式时,可能会导致意外的拆分结果。可以使用非贪婪量词`*?`, `+?`, `??`, `{m,n}?`来避免这个问题。 - 在某些情况下,正则表达式可能过于复杂,导致性能下降,应谨慎设计正则模式。 ...

    delphi xe 10 正则表达式

    在Delphi XE10中,正则表达式是一种强大的文本处理工具,它允许程序员通过模式匹配来查找、替换或提取字符串中的特定模式。本文将深入探讨Delphi XE10中的正则表达式功能,包括基本概念、语法、API接口以及实际应用...

    正则表达式综合练习

    11. **优化技巧**:正则表达式可能会带来性能问题,因此在编写复杂的模式时,应考虑使用非贪婪匹配(`*?`、`+?`、`??`),避免回溯,以及使用预编译模式提高效率。 12. **调试与测试**:使用在线工具(如Regex101、...

    常用正则表达式 正则表达式

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种特殊的语法来描述一个字符串集合,可以非常灵活地表示各种复杂的字符串格式...

    正则表达式.txt,正则表达式.txt

    正则表达式广泛应用于多种场景,如数据验证、搜索与替换、模式匹配等。在编程语言中,几乎所有现代语言都支持正则表达式的使用,例如 Java、Python、JavaScript 等。此外,在日常工作中使用的工具如 grep、sed 和 ...

Global site tag (gtag.js) - Google Analytics