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

正则表达式优化

 
阅读更多

 使用技巧

1)         尽量重用已编译的正则表达式

Java 中使用正则表达式的时候我们需要先编译,所以应该尽量重用我们已经定义的正则表达式。

 

2)         正则表达式的很多优化技巧都是围绕着“减少回溯”这样一个原则进行优化的。

 

3)         使用正确的边界匹配器(^$\b\B等),限定搜索字符串位置

^      匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。

$      匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。

\b    匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B    匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

 

4)         使用具体的元字符、字符类(\d\w\s等),少用”.”字符

\d    匹配一个数字字符。等价于[0-9]

\w   匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。

\s    匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]

                  

5)         使用正确的量词(+*?{n,m}),如果能够限定长度,匹配最佳

*               匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}

+               匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}

?               匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}

{n}             n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o

{n,}          n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}         mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

 

6)         使用非捕获组、原子组,减少没有必要的字匹配捕获用(?:)

(?:pattern)       匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

        

7)         不要滥用括号

  在需要的时候使用括号,在其他时候使用括号会阻止某些优化措施。除非你需要知道.*匹配的最后一个字符,否则请不要使用(.*)

8)         不要滥用字符组

  例如 ^.*[:] 这样会付出处理字符组的代价,而实际上这个式子并需不要用到字符组提供的多字符匹配功能,我认为,当一个字符是元字符时例如 . * 应该使用\.\*表示,在比如需要 [Ff],应当使用不缺分大小写的匹配,而不是字符组。

9)         使用起始锚点

  除非是及其罕见的情况,否则以 .* 开头的正则表达式都应该在最前面添加 ^ 或者\A 如果这个正则表达式在某个字符串的开头不能匹配,那么显然在其他位置它也不能匹配。添加锚点无论是手工添加还是通过优化自动添加都能够配合开头字符/字符串/字串识别优化,节省大量不必要的工作。

10)     将文本独立出来

   1、从量词中提取必须的元素

  用 xx* 替代 x+ 能够暴露必须匹配的 x 同样,用-----{0,2}代替-{5,7}

  2、提取多选结构开头的必须元素

  用th(?:is|at)替代(?:this|that),就能暴露出必须的th。如果不同的多选分支的结尾部分相同,我们也可以从右面"提取"。例如(?:optim|standard)ization  。

11)     将锚点独立出来

  1、在表达式前面独立出 ^ \G

   ^(?:abc|123)(^abc|^123)在逻辑上是等价的,但是许多正则引擎指挥对第一个表达式使用开头字符/字符串/字串识别优化。所以第一种办法的效率高得多。

  2、在表达式末尾独立出$

  虽然 abc$|123$ (?:abc|123)$ 在逻辑上是等价的,但优化的表现可能不同。目前只对Perl有效。

 

12)     注意运算符的优先级

         正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

正则表达式 - 运算符优先级

 

 

 http://www.w3cschool.cc/regexp/regexp-operator.html

 

 

 

 

 

注意细节

 

1)         | 或者符号

         | 的优先级最低,如果想优先匹配,请使用(?:)().

         例如想匹配 a123 b123

         请勿使用 a|b123 a|b123 匹配的是 a b123

         请使用(?:a|b)123,注意尽量使用非捕获组(?:),减少使用捕获组()

                 

2)         [] 中括号

         []表示的是字符簇的概念,使用字符簇需注意:

Ø  字符之间本就是或的关系,所有不需要使用“|”做风格(如果想匹配字符串簇,请阅读上一条);

Ø  -”在字符簇中是表示区间的概念,如果要匹配“-”,请使用转移后的“\-;

Ø  在字符簇中“.”只匹配“.”本身,不匹配其他字符,但为了书写规范,建议还是使用“\.”。

        

         [a-z]        //匹配所有的小写字母

         [A-Z]         //匹配所有的大写字母

         [a-zA-Z]    //匹配所有的字母

         [0-9]          //匹配所有的数字

         [0-9\.\-]   //匹配所有的数字,句号和减号

         [ \f\r\t\n]  //匹配所有的白字符

 

3)         *?,+?,??  量词加问号,非贪婪匹配

         正则默认采用的是贪婪匹配,即尽可能多的去匹配。如果想尽量少的匹配,请在量词后面加上“?

         例如:

         <div id="a" name="a">abcd1234</div><div id="b" name="b">abcd1234</div>

         <div.*</div> 匹配 <div id="a" name="a">abcd1234</div><div id="b" name="b">abcd1234</div>

         <div.*?</div> 匹配 <div id="a" name="a">abcd1234</div>

        

?       当该字符紧跟在任何一个其他限制符(*,+,?{n}{n,}{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

 

 

参考资料

正则表达式语法说明

http://www.w3cschool.cc/regexp/regexp-metachar.html

 

优化正则表达式的诀窍

http://www.cnblogs.com/kissdodog/archive/2013/04/27/3047750.html

 

如何写出高效的正则表达式

http://blog.csdn.net/shangboerds/article/details/7613928

 

正则表达式性能优化(高效正则表达式书写)

http://blog.chacuo.net/329.html

 

Python下的正则表达式原理和优化笔记

http://my.oschina.net/o0Kira0o/blog/138516

 

分享到:
评论

相关推荐

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

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

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

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

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

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

    C语言正则表达式库

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

    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