Regex 正则表达式的计算复杂性

Regex 正则表达式的计算复杂性,regex,language-agnostic,code-metrics,cyclomatic-complexity,code-maintainability,Regex,Language Agnostic,Code Metrics,Cyclomatic Complexity,Code Maintainability,正则表达式很快变得太复杂(对我来说)而无法理解。即使是像[ab][cd]这样简单的东西,也有几个逻辑分支。我的目标是提高代码库的可维护性,因此对这些问题的回答可以帮助我们检测和修复复杂代码: 是否有计算复杂性度量(类似于圈复杂度)包括 正则表达式固有的复杂性 有工具吗 为正则表达式生成一个复杂度数字 有没有可以建议对正则表达式进行简化的工具 您可以尝试使用regexp的编译形式,并尝试将一些代码复杂性度量映射到该度量,如代码行或圈复杂度。要了解我的意思,请看下面的stackoverflow答案:

正则表达式很快变得太复杂(对我来说)而无法理解。即使是像
[ab][cd]
这样简单的东西,也有几个逻辑分支。我的目标是提高代码库的可维护性,因此对这些问题的回答可以帮助我们检测和修复复杂代码:

  • 是否有计算复杂性度量(类似于圈复杂度)包括 正则表达式固有的复杂性
  • 有工具吗 为正则表达式生成一个复杂度数字
  • 有没有可以建议对正则表达式进行简化的工具

  • 您可以尝试使用regexp的编译形式,并尝试将一些代码复杂性度量映射到该度量,如代码行或圈复杂度。要了解我的意思,请看下面的stackoverflow答案:,它显示了如何使用perl访问已编译的regexp格式。此处显示了另一个示例:,引用该页面的工具输出:

    Compiling REx '[bc]d(ef*g)+h[ij]k$'
    1: ANYOF[bc](12)
    12: EXACT <d>(14)
    14: CURLYX[0] {1,32767}(28)
    16:   OPEN1(18)
    18:     EXACT <e>(20)
    20:     STAR(23)
    21:       EXACT <f>(0)
    23:     EXACT <g>(25)
    25:   CLOSE1(27)
    27:   WHILEM[1/1](0)
    28: NOTHING(29)
    29: EXACT <h>(31)
    31: ANYOF[ij](42)
    42: EXACT <k>(44)
    44: EOL(45)
    45: END(0)
    
    编译REx'[bc]d(ef*g)+h[ij]k$'
    1:bc(12)中的任意一个
    12:精确(14)
    14:CURLYX[0]{132767}(28)
    16:OPEN1(18)
    18:准确(20)
    20:STAR(23)
    21:精确(0)
    23:精确(25)
    25:1(27)
    27:WHILEM[1/1](0)
    28:没有(29)
    29:准确(31)
    31:ANYOF[ij](42)
    42:准确(44)
    44:EOL(45)
    45:完(0)
    

    顺便说一句,我祝贺您决定改进代码的可维护性。也就是说,我只是想表达我的疑问,如果你正在处理一个与正规正则表达式等价的正则表达式系统,那么任何形式度量都比经验丰富的开发人员的判断提供更好的指导(甚至可以接近)(描述正则语言;不计数、不查找、不匹配括号对等),或者如果您只处理使用这些特性的正则表达式(尽管您的正则表达式系统能够描述非正则语言),那么就有一个精确的复杂性概念(或者至少您可以派生一个)在某种意义上,正则表达式可以“最小化”

    根据Myhill-Nerode定理,所有正则语言在字符串上的不可区分关系下都有有限个等价类。这些等价类直接对应于正则语言的最小确定性有限自动机中的状态。您可以获取最小确定性有限自动机的状态数托马顿认为语言是语言本身的“基本”复杂性

    有一些算法可以让你从一个(正式的)将正则表达式转换为最小确定性有限自动机,然后再转换为正则表达式。这样做应该会为每种正则语言提供一个规范正则表达式。我想象——但还没有找到证据——从最小确定性有限自动机生成正则表达式的过程可能是m对其进行了修改,以使其产生尽可能短的(按操作数)正则表达式

    语言的复杂性可以是这样一个规范正则表达式中的操作数。任何给定正则表达式的实际复杂性可以是其中的操作数。这个比率可以让你感觉到正则表达式是多么“低效”或“不必要的复杂”


    如果你真的需要正则表达式的非规则特性,那你就倒霉了;在高阶语言类中没有可计算最小化的概念。你可以整天发明复杂性度量,但你永远不会得到一个关于“与基线相比效率有多低”的通用算法答案另一种表达我意思的方式是:做蛋糕可能比做爆米花更难,但如果你需要蛋糕,你必须付出额外的努力才能得到你所需要的。

    复杂性度量?是的,你总是看到类似于
    ((x*)*)*
    (嵌套量化模式)的模式这很复杂。你是对的,许多软件度量都过于简单。但是,它们有助于识别潜在的故障点,特别是在大型代码库中。经过反思,从最小确定性有限自动机获得的正则表达式将不是最小的;正则表达式与非确定性有限自动机,它可以比相应的最小确定性自动机小。这不会有太大的变化,除非您的比率可能小于1(如果您的正则表达式依赖于非确定性来更简洁地描述语言,而不是完全确定地描述语言)。否则,该过程的工作原理相同。