代码之家  ›  专栏  ›  技术社区  ›  Gryph G

Regex性能问题

  •  1
  • Gryph G  · 技术社区  · 8 年前


    我必须为angularjs ng模式属性构造一个正则表达式。正则表达式必须验证文本,而不是每一行或某些片段。 这是我必须验证的格式:一些带有空格和标点符号的文本:数字。2数字

    例如,此文本有效:

    name:1234.32 name:234.43<br>
    name:43.22
    

    例如,此文本无效,因为一个组以“:”开头:

    name:1234.32 :234.43<br>
    name:43.22
    

    例如,此文本无效,因为最后一组没有以2位小数结尾:

    name:1234.32 name:234.43 name:43.2
    

    我已经构建了一些正则表达式,但如果我有一个更大的文本,它会失败 timeout . 只有当最后一个组无效时,它才会失败。 Here 就是一个例子。
    这是我的正则表达式:

    ^(([\S\s]+)\s*:\s*([0-9]+[.][0-9]{2})\s*)+$
    

    你能帮我优化这个正则表达式吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   revo shanwije    8 年前

    您自己的正则表达式有多个以下量词,对匹配字符没有限制,这会导致引擎遇到 catastrophic backtracking 大数据几乎出现故障。

    你可以使用这样的正则表达式:

    ^(([^:]*)\S\s*:\s*\d+\.\d{2}(?!\d))*$
    

    Live demo

    细分:

    ^   # Assert beginning of input string
    (   # Construct a group #1
        ([^:]*) # Construct group #2, match anything except `:`
        \S\s*:\s*\d+\.\d{2}(?!\d)   # Match a valid sequence
    )*  # Repeat #1 as much as possible
    $   # End of input string
    
        2
  •  0
  •   Guillodacosta    8 年前

    试试这个 ^(([\S\s]+)\s*?:\s*?([0-9]+[.][0-9]{2})\s*?)+$

    但我建议,如果可以的话,将文本分成几行,并对每一行进行评估,然后停在不抱怨测试的那一行。