#.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.