Движок "Конечных автоматов" повисает на регексе - PHP движок справляется

Issue #365 new
Oleg Sychev repo owner created an issue

Именно что повисает, а не выдает ошибку - мол автомат слишком сложный. Регекс (в расширенной нотации) \s (?###parens_opt<) res (?###>) \s=\s (?###parens_opt<) (?###parens_opt<) (?###parens_opt<) str (?###>) \s[\s (?###parens_opt<) 0+ (?###>) \s] (?###>) \s.\sisDigit\s(\s) (?###>) \s;+\s

Тестовые строки res = str[0].isDigit(); (res) = (( (str)[(0)]).isDigit()); ( ( res ) ) = ( ( ( ( ( str ) ) [ ( ( 0 ) ) ] ) . isDigit ( ) ) ) ;

Валерий - посмотрите пожалуйста в чем там дело, дефолты для сложности регексов левые или что-то другое происходит....

Comments (5)

  1. Oleg Sychev reporter

    А вот такой регекс работает

    \s*
    (?###parens_opt<)
      res
    (?###>)
    \s*=\s*
    (?###parens_opt<)
      (?###parens_opt<)
        (?###parens_opt<)
          str
        (?###>)
        \s*\[\s*
        (?###parens_opt<)
          0+
        (?###>)
        \s*\]
      (?###>)
      \s*\.\s*isNumber\s*\(\s*\)
    (?###>)
    \s*;+\s*
    
  2. Oleg Sychev reporter

    Еще раз ошибочный регекс чтобы конкретно

    \s*
    (?###parens_opt<)
      res
    (?###>)
    \s*=\s*
    (?###parens_opt<)
      (?###parens_opt<)
          (?###parens_opt<)
          str
          (?###>)
        \s*\[\s*
        (?###parens_opt<)
          0+
        (?###>)
        \s*\]
      (?###>)
      \s*\.\s*isDigit\s*\(\s*\)
    (?###>)
    \s*;+\s*
    
  3. Oleg Sychev reporter

    О, а теперь работает - только притормаживает конкретно.... Странности какие-то.

  4. Valeriy Streltsov

    fa.png

    Автомат большой и там много рекурсии, и ещё parens_opt работает медленнее чем parens_req. Посмотрите на states/transitions limits и меньше сделайте если всё еще тормозит. Обратных ссылок в регексе нет, и быстрый метод матчинга уже никак не оптимизируешь.

  5. Log in to comment