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

原子组与防止回溯 [正则表达式]

阅读更多
原子组与防止回溯

在一些特殊情况下,因为回溯会使得引擎的效率极其低下。

让我们看一个例子:要匹配这样的字串,字串中的每个字段间用逗号做分隔符,第12个字段由P开头。

我们容易想到这样的正则表达式<<^(.*?,){11}P>>。这个正则表达式在正常情况下工作的很好。但是在极端情况下,如果第12个字段不是由P开头,则会发生灾难性的回溯。如要搜索的字串为“1,2,3,4,5,6,7,8,9,10,11,12,13”。首先,正则表达式一直成功匹配直到第12个字符。这时,前面的正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11,”,到了下一个字符,<<P>>并不匹配“12”。所以引擎进行回溯,这时正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11”。继续下一次匹配过程,下一个正则符号为点号<<.>>,可以匹配下一个逗号“,”。然而<<,>>并不匹配字符“12”中的“1”。匹配失败,继续回溯。大家可以想象,这样的回溯组合是个非常大的数量。因此可能会造成引擎崩溃。

用于阻止这样巨大的回溯有几种方案:

一种简单的方案是尽可能的使匹配精确。用取反字符集代替点号。例如我们用如下正则表达式<<^([^,\r\n]*,){11}P>>,这样可以使失败回溯的次数下降到11次。

另一种方案是使用原子组。

原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是<<(?>正则表达式)>>。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成<<^(?>(.*?,){11})P>>。一旦第十二个字段匹配失败,引擎回溯到原子组前面的<<^>>。
分享到:
评论

相关推荐

    深入浅出正则表达式

    1. 什么是正则表达式 2 2. 不同的正则表达式引擎 2 3. 文字符号 2 4. 正则表达式引擎的内部工作机制...13. 原子组与防止回溯 14 14. 向前查看与向后查看 14 15. 正则表达式中的条件测试 17 16. 为正则表达式添加注释 17

    正则表达式素材4

    1. **词法分析**:将输入的正则表达式分解为一系列原子单元(如字符、量词、特殊符号等)。 2. **语法分析**:构建正则表达式的抽象语法树(AST),这有助于理解表达式的结构和逻辑。 3. **匹配引擎**:设计算法实现...

    php正则表达式深入浅出.docx

    13. 原子组与防止回溯 原子组是正则表达式中的一个重要概念,用于描述字符串的原子化。防止回溯是正则表达式中的一个重要概念,用于描述回溯的防止。 14. 向前查看与向后查看 向前查看和向后查看是正则表达式中的...

    精通正则表达式

    正则表达式是一种强大的文本处理工具,用于在字符串中匹配、查找、替换或者提取特定模式。它是编程语言中不可或缺的一部分,被广泛应用于数据验证、文本分析、搜索与替换等场景。"精通正则表达式"这本书,特别是第三...

    简体中文精通正则表达式 第三版

    2. **高级特性**:深入探讨了零宽度断言、回溯控制、原子组等高级主题,这些是构建高效且精确的正则表达式的基石。 3. **正则表达式引擎**:分析了不同编程语言和环境中正则表达式的实现差异,如Perl、Python、Java...

    验证正则表达式

    &gt;pattern)` 表示非捕获的原子组,一旦匹配就不再回溯。 - **重复字符**:`\{n}`、`\{n,}`、`\{n,m\}` 分别表示精确、至少和至少到最多重复。 6. **实例应用** - **邮箱验证**:`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]...

    php 正则表达式 ppt文档

    原子是正则表达式的基本单位,可以是单个字符、数字、模式单元(如括号内的组合)、原子表(如[ABC])或者转义序列。元字符具有特殊含义,如"*"表示前一个原子可重复0次或多次,"."匹配任意字符(除换行符外),"^...

    正则表达式常用符号详解

    &gt;exp)**:不可回溯的原子组。 - **(?&lt;x&gt;-&lt;y&gt;exp)**:条件匹配。 - **(?im-nsx:exp)**:设置模式标志的嵌套。 - **(?im-nsx)**:仅设置模式标志。 - **(?(exp)yes|no)**:条件分支,如果 exp 成功匹配,则执行 yes ...

    正则表达式PDF教程

    - **原子组与防止回溯**:原子组可以在一定程度上优化匹配过程,避免不必要的回溯。 - **向前查看与向后查看**:这两种技术用于在不实际消耗输入的情况下测试后续或之前的文本是否满足条件。 - **肯定式向前查看**...

    正则表达式测试器

    7. **回溯与效率**:正则表达式在匹配时可能会进行回溯,这可能导致性能下降。合理使用非贪婪匹配和原子组(`(?&gt;...)`)可以提高效率。 8. **字符类**:`[abc]`匹配任何一个括号内的字符,`[^abc]`则匹配除括号内...

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

    回溯是正则表达式匹配过程中的一个步骤,当正则表达式引擎尝试一个模式匹配失败时,它会回退到之前的状态,尝试不同的匹配路径。 在优化之前,需要了解NFA模式下的正则表达式匹配原理。NFA模式下,正则表达式的匹配...

    C#正则表达式基础知识

    - **MatchCollection类**:包含一组`Match`对象,通常用于表示正则表达式在输入字符串中的所有匹配。 - **Group类**:表示匹配结果中的一个捕获组。 - **GroupCollection类**:包含一组`Group`对象,通常用于表示一...

    [正则表达式经典实例].(美)高瓦特斯,(美)利维森.扫描版.pdf

    3. **回溯控制**:通过使用原子组`(?:pattern)+`或懒惰限定符`*?`、`+?`等来优化匹配过程,减少不必要的回溯。 ### 学习资源推荐 1. **在线教程**:如《Regular Expressions Cookbook》、《Mastering Regular ...

    用于查找文本的正则表达式.zip

    正则表达式是一种强大的文本处理工具,常用于在大量文本中进行查找、替换或提取特定模式的字符串。在“用于查找文本的正则表达式”这个主题中,我们将深入探讨正则表达式的概念、语法以及如何在实际应用中有效地利用...

    正则表达式正则表达式

    &gt;)`**:原子组,强制正则引擎一次性匹配整个组,不可回溯。 #### 预测先行 - **`(?=)`**:正向预测先行,匹配后面跟有指定模式的字符串部分,但不消耗字符,即匹配后继续从当前位置开始搜索。 - **`(?!)`**:反向...

Global site tag (gtag.js) - Google Analytics