Оптимизация Reg Exp

#.net #regex #optimization

#.net #регулярное выражение #оптимизация

Вопрос:

Мне нужно оптимизировать следующий reg exp, чтобы он выполнялся быстрее. Кто-нибудь может помочь?

 ([dw]{15}[x01]d{12}[x01]d{2}(.){6}((13((0[0-9]|([1-4][0-9])|5[0-9]))|14((0[0-9]|([1-2][0-9])|30)))[0-5][0-9])801(?:.*))
  

Спасибо

Комментарии:

1. Было бы полезно, если бы вы опубликовали, что это должно делать.

2. Возможно, вам следует опубликовать некоторый код, который вы также используете.

3. Я бы подумал, что любая скорость, которую вы получите от оптимизации регулярного выражения, будет минимальной, если вообще будет. Вы уверены, что у вашего регулярного выражения есть бутылочное горлышко?

4. [dw] является избыточным. w подразумевает d . Замена вашего начального значения [dw] на w может оказать довольно большое влияние на время выполнения. Кроме того, если вам не нужны отдельные группы захвата, укажите RegexOptions.ExplicitCapture в параметре options.

5. @Jim: Я был бы очень удивлен, если бы [dw] оказалось, что это работает медленнее, чем w . Фактически это объединение двух наборов, представленных d и w ; ни один символ не должен проверяться более одного раза. Вы, вероятно, думаете о (?:d|w) ; теперь это главный убийца производительности.

Ответ №1:

Это оптимизированная версия: удалено множество избыточных классов символов и групп. В конечном счете, было бы лучше знать, что должно делать регулярное выражение.

 w{15}x01d{12}x01d{2}.{6}(13[0-5]d|14([0-2]d|30))[0-5]d801.*
  

Редактировать: на основе вашей новой информации вы можете сократить ее до:

 w{15}x01d{12}x01d{2}.{6}(13[0-5]d|1400)[0-5]d801.*
  

Ответ №2:

Без знания того, что вы хотите, чтобы ваше регулярное выражение выполняло, его сложно оптимизировать, но вы могли бы попробовать передать RegexOptions.Скомпилирован в конструктор регулярных выражений. Это займет больше времени для создания объекта regex, но будет означать, что он выполняет поиск быстрее.

Комментарии:

1. RegexOptions.Compiled это не панацея. В зависимости от того, как используется регулярное выражение, это может значительно ухудшить производительность.

Ответ №3:

Reg exp выполняет поиск в текстовом файле записей, имеющих следующий формат и значения:

Запись должна начинаться с 15 цифр или символов, за которыми следует специальный символ, [x01] за которым следуют 12 цифр и [x01] еще раз, за которыми следуют 2 цифры и любые 6 символов, затем найдите значения (значения даты в формате Часы Минуты Секунды без какого-либо : или . разделения часов, минут и секунд в файле) между 130000 и 140059, которые являются частью reg exp, который я извлек ниже, и, наконец, значение 801 и любое количество символов, которые могут следовать.

 ((13((0[0-9]|([1-4][0-9])|5[0-9]))|14((0[0-9]|([1-2][0-9])|30)))[0-5][0-9])
  

Надеюсь, я был здесь ясен и доходчив.

Также я добавил ^ в начале reg exp и $ в конце.

Я использовал варианты регулярных выражений.Скомпилированные параметры также, но без значительного улучшения.

Спасибо за все советы, я попробую их. Тем временем, если у вас есть еще какие-либо варианты оптимизации, пожалуйста.

Ответ №4:

Да, извините, ошибка с моей стороны, временная часть находится между 130000 и 143059, я попробую ваше решение, bluepnume.