Переполнение стека для регулярных выражений Java - PullRequest
0 голосов
/ 31 октября 2011

Я получаю stackoverflow для проверки CSV для большого строкового поля.

Regex:

(?![^\",][^,]*\")(\"(\"\"|[^\"])*\"|[^\",]*),[0-9]*

TargetString:

"Nuvi 1450LMT - это портативный приемник глобальной системы позиционирования от Garmin, предлагающий шаг вперед по сравнению со стандартными моделями компании 1450 и 1450T. Включая бесплатные карты времени жизни и обновления трафика, эту модель можно обновлять раз в три месяца, чтобы обеспечить для получения самой последней информации о местоположении. Встроенный передатчик FM-сигнала может предоставлять самую свежую информацию о дорожном движении, касающуюся аварий, строительства и других форм блокировки дорог, предоставляя пользователям достаточно времени для выбора альтернативного 5-дюймовый сенсорный TFT-дисплей с подсветкой, обеспечивающий четкие визуальные инструкции, в комплекте с технологией «Lane Assist», которая предоставляет виртуальные инструкции от первого лица о том, какие полосы движения использовать. В комплект включены всесторонние карты «City Navigator» для Канада, США и Мексика, с двух- и трехмерной поддержкой и более чем 6 миллионами выбранных пользователем объектов. Навигация по пешеходам также полностью поддерживается на 1450LMT, с "CityXplore" r "служба, предлагающая информацию об автобусах, железных дорогах, трамваях и других видах общественного транспорта для самых разных крупных городов. Топливосберегающие маршруты можно определить с помощью режима «EcoRoute», в то время как технология прогнозирования «HotFix» помогает поддерживать наиболее точную информацию о местоположении, даже когда сигнал временно потерян. Навигация по фотографиям поддерживается через сервис Garmin «Photo Connect», а дополнительные автомобильные маркеры и голоса могут быть загружены через веб-сайт «Garmin Garage».

Особенности

5-дюймовый цветной сенсорный TFT-дисплей с подсветкой Бесплатные обновления трафика в течение жизни Бесплатные карты Поддержка карт MicroSD Голосовые подсказки Функция Lane Assist Автоматический перенаправление Уклонение от маршрута Совместимость с FM-трафиком Маршрутизация EcoRoute Особые достопримечательности Маркер и голосовая настройка гаражного автомобиля Garmin ", 9

Может кто-нибудь помочь оптимизировать его. Можете ли вы оптимизировать, используя собственнические квантификаторы

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

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

Лучшим подходом является выбор и использование достойной библиотеки CSV для Java.Проверьте ответы на этот вопрос:

Можете ли вы порекомендовать библиотеку Java для чтения (и, возможно, записи) файлов CSV?

1 голос
/ 31 октября 2011

Эту ошибку можно устранить, добавив несколько знаков плюс:

"(?![^\",][^,]*\")(\"(\"\"|[^\"]+)*\"|[^\",]+),[0-9]+"
                                ^           ^       ^

Обратите внимание, что это обычные знаки плюс, а не собственнические модификаторы.Второй и третий плюсовые символы заменили звездочки, но это первый, который имеет реальное значение.Это [^\"]+ - это то, что потребляет большую часть текста, и он делал это по одному символу за раз до того, как я добавил этот знак плюс.

Но он все равно не будет совпадать, он просто быстрее провалится.Это регулярное выражение предназначено для сопоставления полей CSV с правильно экранированными кавычками, и, если я правильно вас понимаю, ваша проблема в том, что они не экранированы.Это гораздо более сложная проблема, но мне интересно, нужно ли вам вообще иметь дело с этими внутренними цитатами.Разве это не сработает?

".*?",\d+

... или как строковый литерал Java:

"\".*?\",\\d+"

Или вы пытаетесь исправить строку, избегая кавычек самостоятельно?

...