`
moonyang
  • 浏览: 4618 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

正则表达式必须做预编译

 
阅读更多

转载记录

 

最近看了阿里巴巴的java代码开发规范发现处理正则表达式的时候必须要预编译,可以有效加快正则匹配速度。

 

错误案例

现象描述: Java5的正则表达式的实现可能会导致JVM的崩溃;在递归处理上性能极度低下

 

错误分析

错误原因: 1、Java5 自身带的实现,没有执行事实上perl标准,导致很多书写方式上和perl的表达不一样, 导致学习成本高 2、已经明确的观察到,Java5的实现可能会导致JVM的崩溃。 3、在深度递归处理下性能很差 4、正则表达式在运行期编译很耗费性能,我们可以看Perl5Compiler().compile方法有差不多200行的代码,都是在做编译工作。

以下是一个错误的例子:每次需要用正则去匹配的时候,都需要把pattern编译一遍,导致性能低下

  private static final String LOGINID_REGEX = "^[a-zA-Z]+[a-zA-Z0-9]+";
  ....
  if (!Pattern.compile(LOGINID_REGEX).matcher(resultStr).find()) {
    ...
  }

正确用法

正确用法: 1. 建议使用ORO库来处理这类问题。 2. 不要使用大规模长度的表达式, 比如根据配置文件的字符串, 拼接成一个非常长的表达式。 这个会导致匹配性能非常的低下。 3. 表达式一定要求是预先编译的, 这个编译过程是非常具有消耗性能的。 4. 如果一些是非频繁的使用的表达预先编译可能在代码的处理上会有点麻烦, 不过, ORO提供给我们一个比较好的util实现:Perl5Util, 他能在cache住一些经常被使用的表达式。 不过大约就是20个样子。 更多http://sdh5724.javaeye.com/blog/277352

  private final static Pattern pattern = new Perl5Compiler().compile("^\\d+$", '''Perl5Compiler.READ_ONLY_MASK''');
  //请注意,由于Pattern本身不是线程安全的,只有加了READ_ONLY_MASK的编译参数才能用于共享使用,否则会出现并发访问的问题,导致错误结果

  public void mach(){
    PatternMatcher matcher = new Perl5Matcher();
    if (matcher.matches(str, pattern)) { …… }
  }
分享到:
评论

相关推荐

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

    - **预编译模式**:使用`RegexOptions.Compiled`选项可以提高多次使用同一正则表达式的性能。 - **忽略大小写**:添加`RegexOptions.IgnoreCase`选项,使匹配不区分大小写。 - **多行模式**:使用`RegexOptions....

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

    正则表达式(Deelx版)是一种强大的文本处理工具,它允许程序员和用户通过预定义的模式来匹配、查找、替换或者分析字符串。Deelx版是专门为提高正则表达式性能和功能而设计的一个支持库,适用于各种编程语言和应用场景...

    C语言正则表达式库

    虽然这可能会导致性能问题,但通过优化的匹配引擎和使用预编译模式,可以显著提高效率。 4. **匹配选项**:提供了许多可配置的匹配选项,例如不区分大小写、单行模式(忽略换行符)以及多行模式(^和$匹配任何行的...

    java正则表达式.zip

    Pattern类是Java正则表达式的起点,它将一个正则表达式编译成一个模式对象。这个编译过程可以优化后续的匹配操作。例如,创建Pattern对象的代码如下: ```java Pattern pattern = Pattern.compile("正则表达式"); `...

    java正则表达式匹配工具

    这个类是正则表达式的模板,负责编译和存储正则表达式。一旦正则表达式被编译为`Pattern`对象,可以多次使用它来创建`Matcher`对象,执行实际的匹配操作。例如,你可以使用`Pattern.compile("正则表达式")`来创建一...

    JAVA正则表达式大全

    这份文档可能深入讲解了`Pattern`和`Matcher`类的用法,如`Pattern.compile()`用于编译正则表达式,`Matcher.find()`用于查找字符串中的匹配部分,`Matcher.group()`获取匹配的子串,以及如何使用`Pattern.split()`...

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

    - **编译正则表达式**:使用`re.compile()`函数将正则表达式编译为`Pattern`对象,提高匹配速度。 - **模式方法**:`Pattern`对象提供`match()`、`search()`等方法进行匹配,以及`sub()`、`split()`等方法进行替换...

    测试正则表达式软件

    - 编译和执行速度的指标,对于复杂正则表达式尤其有用。 在给定的“测试正则表达式”软件中,你可以输入自己的正则表达式,然后尝试匹配不同的文本,以确保它能正确识别你需要匹配的模式。这对于学习和优化正则...

    java_zhengze.rar_正则表达式_正则表达式 java

    `Pattern`类用于编译正则表达式,而`Matcher`类则用于执行匹配操作。例如,我们可以这样创建一个`Pattern`对象并进行匹配: ```java String regex = "^[a-zA-Z0-9]+$"; // 验证只包含字母和数字的字符串 Pattern ...

    正则表达式综合练习

    `),避免回溯,以及使用预编译模式提高效率。 12. **调试与测试**:使用在线工具(如Regex101、RegExr)可以帮助开发者调试和测试正则表达式,确保它们按预期工作。 总的来说,掌握正则表达式能够极大地提升你在...

    正则表达式(regex)C语言源码,超强查找/替换算法

    它支持多种正则表达式语法,包括基本的字符匹配、量词、分组、预查以及更多的高级特性。由于它是纯C代码,因此可以方便地移植到各种操作系统和硬件平台。 **2. C语言与正则表达式** 在C语言中,没有内置的正则...

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

    - `java.util.regex.Pattern`:编译正则表达式为模式对象,用于后续的匹配操作。 - `java.util.regex.Matcher`:与Pattern对象配合,执行实际的匹配、查找和替换操作。 3. **MetaCharacters(元字符)** - 元...

    java 正则表达式应用jar包 regex-smart.jar

    1. **Pattern类**:这是正则表达式的核心,用于编译正则表达式并创建模式对象。一旦编译完成,该模式可以多次使用,提高了效率。例如: ```java Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+$"); ``` 2. *...

    正则表达式实时测试工具(源码)

    3. 预编译与执行:工具可能支持预编译正则表达式,以提升多次匹配的效率。 4. 功能选项:如忽略大小写、全局匹配、多行模式等,用户可以根据需求调整这些选项。 5. 代码高亮与提示:对于正则表达式的关键字和特殊...

    正则表达式教程合集(各种语言的,超全)

    `Pattern`类用于编译正则表达式,`Matcher`类用于执行匹配和查找操作。Java的正则表达式与.NET类似,但也有一些特有的语法和特性。 无论在哪种语言中,正则表达式的基本元素都包括: 1. 字符:匹配单个字符,如"a...

    boost库中的正则表达式

    `basic_regex`的实例表示了一个编译后的正则表达式模式。例如,`regex`和`wregex`是对`basic_regex<char>`和`basic_regex<wchar_t>`的别名,分别用于处理宽字符和窄字符的正则表达式。 2. **构造函数**:`basic_...

    正则表达式匹配/可以自定义正则表达式

    使用时,通常将正则表达式编译成Pattern对象,再用Matcher对象进行匹配、查找、替换等操作。例如,在Python中: ```python import re pattern = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')...

    delphi正则表达式包

    合理使用非贪婪匹配、避免不必要的回溯以及使用预编译模式(如`Compiled`属性)都能提高匹配效率。 总的来说,Delphi正则表达式包通过TPerlRegEx组件使得Delphi 7开发者能充分利用正则表达式的强大功能,进行高效且...

    简单C#正则表达式验证工具源码

    `Regex`类的构造函数允许开发者传递一个正则表达式字符串,并可以选择是否编译成正则表达式对象。编译可以提高匹配性能,但会增加内存占用,对于频繁使用的正则表达式比较有利。 此外,该工具还可能包含了错误处理...

    正则表达式生成和检验工具

    - **预编译和命名组**:在C#中,可以使用`RegexOptions.Compiled`选项预编译正则表达式以提高速度。`(?模式)`用于创建命名组,便于后续处理。 7. **正则表达式调试** - **跟踪和调试**:某些工具和编程环境支持...

Global site tag (gtag.js) - Google Analytics