Regex的性能问题

一、在web中,regex会有一些性能的问题,现在小总结一下,作为以后的提示

1、正则规则不变的情况下,表达式最好是一次编译,每次编译会很影响性能,大概十几倍的差别。

2、正则表达式的写法,也会有性能影响,详情看下文。

3、正则的调试工具,RegexBuddy,还挺好用的。

其实大概就三个点,就能搞定正则,但是详情的还挺多东西的

二、正则的一些细节规则

1、在写完最好测试一下回调次数,RegexBuddy工具还挺好的。
2、正则表达式以简单的、必需的字元开始
   最理想的情况是,一个正则表达式的起始字元应当尽可能快速地测试并排除明显不匹配的位置。用于此目的好的起始字元通常是一个锚(^或$)、特定字符(如x 或\u363A)、字符类(如[a-z]或速记符、单词边界(\b))。如果可能,避免以分组或选择字元开头,避免顶级分支,如/one|two/,因为这样会强迫正则表达式识别多种起始字元。Firefox浏览器对起始字元中使用的任何量词都很敏感,能够优化得更好。例如,以\s\s*替代\s+或\s{1,}。其他浏览器大多优化掉这些差异。

3、编写量词模板,使它们后面的字元互相排斥
  当字符与字元相邻或子表达式能够重叠匹配时,一个正则表达式尝试分解文本的路径数量将增加。为避免出现此现象,尽量具体化模板。当表达“[^"\r\n]*”时不要使用“.*?”(依赖回溯)。

4、减少分支的数量,缩小它们的范围
   当分支使用 | (竖线)时,可能要求在字符串的每一个位置上测试所有的分支选项。通常可通过使用字符类和选项组件减少对分支的需求,或者将分支在正则表达式上的位置推后(允许到达分支之前的一些匹配尝试失败)。

字符类比分支更快,因为它们使用位向量实现(或其他快速实现)而不是回溯。当分支必不可少时,在不影响正则表达式匹配的情况下,将常用分支放在最前面。分支选项从左向右依次尝试,一个选项被匹配上的机会越多,它被检测的速度就越快。
注意:由于Chrome 和Firefox 浏览器自动执行这些优化中的某些项目,因此较少受到手工调整的影响。

5、使用非捕获组
  捕获组花费时间和内存用于记录后向引用,并保持它们是最新的。如果不需要一个后向引用,可通过使用非捕获组避免这种开销,例如,(?:…)替代(…)。当需要一个完全匹配的后向引用时,有些人喜欢将正则表达式包装在一个捕获组中,这是不必要的,因为可以通过其他方法引用完全匹配。例如,使用regex.exec()返回数组的第一个元素,或替换字符串中的$&。用非捕获组取代捕获组在Firefox 浏览器中影响很小,但在其他浏览器上处理长字符串时影响很大。

6、使用适当的量词
   正如建议45所讨论过的那样,“贪婪”量词和“懒惰”量词即使匹配同样的字符串,其查找匹配过程也是不同的。在确保正确等价的前提下,使用更合适的量词类型(基于预期的回溯次数)可以显著提高性能,尤其在处理长字符串时。

三、正则工具的使用

 http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_options.gif?_=5860893

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_match.gif?_=5860893

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_replace.gif?_=5860893

 

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_debug.gif?_=5860893

 

四、当然了,正则必不可少的就是要有个语法表

 这个可以看看下一:http://www.cnblogs.com/wu-fm/p/6673938.html

ok,就这些。

 

 

 

 

 

有些内容转载自一下地址,谢谢这些博主的分享:

http://www.0430.com/cn/web246371/

http://www.cnblogs.com/tsql/p/5860893.html

 

转载于:https://www.cnblogs.com/wu-fm/p/6673921.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为您介绍Rust正则表达式。Rust正则表达式是一种在Rust编程语言中使用的文本模式匹配库。它为Rust编程语言提供了一种简单而强大的方法来解析和匹配文本。此外,Rust正则表达式也可以用于替换文本中的模式。 ### 回答2: Rust Regex是Rust语言中一个非常强大的正则表达式库。正则表达式是一种用来匹配和操作字符串的工具,它可以非常灵活地进行模式匹配和替换操作。 Rust Regex提供了丰富的正则表达式语法和API,可以进行各种复杂的字符串处理。它支持常见的正则表达式功能,如字符匹配、数量限定、分组、选择等。此外,它还支持一些高级功能,如零宽断言和非贪婪匹配等。 Rust Regex的特点之一是它是基于确定有限自动机(DFA)的。这种底层实现使得Rust Regex在处理大型和复杂的输入时能够保持较高的性能。而且,Rust Regex还提供了一些优化选项,如缓存编译结果和预编译模式等,以进一步提高运行效率。 在使用Rust Regex时,首先需要使用regex::Regex::new函数将带有正则表达式的字符串编译为一个Regex对象。然后可以使用Regex对象的方法来进行匹配、替换、提取等操作。Rust Regex还支持迭代器功能,可以对匹配结果进行迭代处理。 Rust Regex的使用非常灵活,它可以满足各种不同的字符串处理需求。无论是简单的字符串匹配还是复杂的文本提取,Rust Regex都可以帮助我们快速而准确地完成任务。 总之,Rust Regex是Rust语言中一个功能强大、性能优越的正则表达式库。它提供了丰富的功能和灵活的API,可以帮助我们处理各种字符串操作。无论是在文本解析、数据清洗还是模式匹配等场景下,Rust Regex都是一个非常好用的工具。 ### 回答3: Rust是一种系统编程语言,具有高性能和内存安全的特点。Rust中的regex库提供了用于处理正则表达式的功能。正则表达式是一种强大的文本模式匹配工具,可以用于验证、搜索和替换字符串。 Rust的regex库实现了Perl兼容的正则表达式语法。使用这个库,我们可以创建正则表达式并与字符串进行匹配。它提供了许多方法来处理正则表达式,例如使用特定的模式匹配字符串,并提取匹配的结果。 Rust的regex库具有高性能和线程安全的特点。它使用了一种称为NFA(非确定有限自动机)的算法来实现正则表达式的匹配。通过使用此算法,它可以在极短的时间内处理大量的文本数据。 Rust的regex库还提供了一些方便的功能,例如反向匹配、贪婪匹配和忽略大小写匹配。它还支持Unicode字符的处理,可以处理各种语言和字符集。 除了基本的正则表达式功能之外,Rust的regex库还提供了一些附加的功能。它可以在字符串中查找和替换匹配的部分,并提供了一些对字符串进行处理的方法,例如拆分字符串和迭代匹配结果。 总而言之,Rust的regex库是一个功能强大且易于使用的工具,用于处理正则表达式。无论是验证输入、搜索文本还是进行字符串替换,它都能提供高效和准确的功能,并且非常适合用于处理大量的文本数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值