`
sharp-fcc
  • 浏览: 110774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正则表达式优化

    博客分类:
  • util
阅读更多

正则表达式的优化  在Jeffrey E. F. Friedl 的<<精通正则表达式>>中提到了几种技巧。今天着重说一种比较实用的。

 

比较简单的:

        在类似 .* 或者 [\s\S]*中匹配的时候,量词* 默认是贪婪的,启用最大匹配模式, 会匹配到尽量多的字符串,如果我们的需求是匹配<b>text</b>中的text,这样就不适用了。具体来说,我们假设这个正则表达式是: <b>.*</b>但是如果目标字符串很长 <b>text</b>ssssssssssss....(此处省略100000个s) 这样就很悲催,.* 会匹配<b>后面所有的字符串,也就是 100000+ 的字符串,然后一个一个回朔,回朔100000多次之后才正确匹配</b>

       很显然这种量词最大匹配的模式效率很差,当然字符串小的话无所谓,可以用?号开启最小匹配模式。优化后的表达式是 <b>.*?</b> , 让*号默认从小的开始,就是匹配一个字符之后,将后面的跟</b>进行对比。这样4次比较就哦了。 

 

稍微复杂点的:

在书中,提炼出了一种匹配的通用模式

normal*(specail normal*) 咋一看不知道什么意思,简单的说 就是让normail尽量多的匹配正常的文本,然后摘出需要特殊处理的字符,增加对非常规字符的处理。我们举一个例子来说明这种问题。

还是匹配<b>text</b> 一般的,严格一点,我们使用 <b>(?!</?b>.)*</b>来匹配只要中间不出现<b>或者</b>都认为结束了,但是这是一个串匹配的过程,效率还不是最优的。

用通用模式来实现可以写成:

<b>                       #匹配开头的<b>

    (?>[^<]*)            #匹配任意数量的normal 

       (?>                 #固化分组

           (?!</?b>)    #锚定不是需要标签的字符

           <                  #特殊字符

           [^<]*              #匹配任意数量的normal

        )*                      #

</b>                          #匹配尾部的</b>

这种模式的核心思想视永不回朔,永远向前匹配,技巧性很强,你得先分析出什么字符可以作为specail的,在本例中,使用了< 字符,应为</b>的第一个字符就是 < , 把中间的内容都跟<比, 中间内容可能含有<a><html>诸如此类的内容, 要把<a>跟</b>区分开来,使用了锚定,相当于在有< 的时候做下判断,是单字符比较,速度较快。

1
2
分享到:
评论

相关推荐

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

    - 程序会显示匹配结果,包括匹配的子串、开始位置和结束位置等信息,帮助开发者调试和优化正则表达式。 5. 使用技巧 - **预编译模式**:使用`RegexOptions.Compiled`选项可以提高多次使用同一正则表达式的性能。 ...

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

    - **高效引擎**:Deelx版优化了正则表达式的解析和执行速度,使得处理大量数据时更加迅速。 - **扩展功能**:可能包含更多的元字符、预定义类、条件表达式等,提供了更丰富的操作可能性。 - **错误检查**:提供更...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    精通正则表达式(第3版)(含awz3 mobi epub)

    本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...

    java正则表达式.zip

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

    易语言正则表达式文本替换

    - 考虑性能问题,对于大量文本的处理,优化正则表达式和替换策略是很重要的。 5. **应用场景** - 数据清洗:去除或替换文本中的特定字符或模式,如邮箱地址验证、电话号码格式化等。 - 信息提取:从大量文本中找...

    正则表达式生成工具,正则表达式生成工具

    正则表达式生成工具,如"The Regulator",就是辅助开发者或用户创建、测试和优化正则表达式的软件。 正则表达式生成工具的主要功能包括: 1. **模式构建**:提供图形化界面或者交互式输入,帮助用户构建复杂的正则...

    正则表达式翻译工具,RegexTest.exe

    使用RegexTest.exe时,用户应了解正则表达式的这些基本概念,并结合工具的特性,逐步构建和优化自己的正则表达式。对于初学者,学习正则表达式可能有些挑战,但通过实践和使用像RegexTest.exe这样的辅助工具,可以...

    正则表达式调试工具

    正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将详细介绍"正则表达式调试工具V3.0 绿色免费版"的特点及其在软件开发中的应用。 该调试工具界面简洁,旨在为开发者提供一个友好的环境来...

    通过正则表达式生成数据

    3. **效率**:如果需要大量生成数据,优化正则表达式和生成算法以提高效率。 通过理解并熟练运用正则表达式生成数据,我们可以更高效地完成测试、模拟和数据分析等工作,同时也能更好地保护用户隐私。无论是手动...

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

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业程序员能够快速上手。在易语言中,正则表达式是...在实践中,不断探索和优化,才能更好地利用易语言的正则表达式功能。

    测试正则表达式软件

    这对于学习和优化正则表达式非常有帮助,避免了在代码中反复测试的麻烦。 总的来说,正则表达式是Java编程中不可或缺的一部分,熟练掌握其用法可以提高代码的效率和可读性。测试正则表达式的软件是开发者的好帮手,...

    详解Java判断是否是整数,小数或实数的正则表达式

    在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...

    qt正则表达式测试工具

    - 利用工具提供的功能,如捕获组、模式修饰符等,优化正则表达式。 - 检查正则表达式的性能,避免过度复杂的模式导致效率降低。 在实际开发中,熟练掌握Qt的QRegExp类和正则表达式语法,能大大提高处理文本数据的...

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

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

    正则表达式工具类,正则表达式封装,Java正则表达式

    在Java编程语言中,正则表达式是一种强大的文本处理工具,用于匹配、查找、替换等操作。本节我们将深入探讨正则表达式工具类`RegUtils`,它封装了正则表达式的常用功能,便于在实际开发中进行复用。 首先,`...

    正则表达式综合练习

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

    正则式工具(自动生成正则表达式)

    这包括单个字符串的测试和多字符串集的批量验证,便于调试和优化正则表达式。 3. **解释器**:工具通常会提供正则表达式的解析视图,以图形化或文字形式解释每个部分的作用,帮助理解正则表达式的匹配逻辑。 4. **...

    正则表达式到NFA

    总的来说,从正则表达式到NFA的转化是编译原理中的核心概念,它涉及到正则表达式的运算规则、NFA的结构和转换算法,以及可能的优化策略。通过理解和掌握这一过程,我们可以更好地理解和利用正则表达式这一强大的工具...

Global site tag (gtag.js) - Google Analytics