![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| compiler91 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
Добрый день!
Есть задача: из списка целых чисел представленного строкой в формате "1, 2, 34, 5" получить массив этих самых чисел. При неверных входных данных возвращать null. Задачу решаю используя regexp. Вот что у меня получилось: (\d+) - число (?: (\d+) ,) - число с запятой (?: (\d+) ,)+? - список чисел заканчивающихся запятой ^(?: (\\d+) ,)+? (\\d+)$ - итого Листинг программы:
Но где-то вкралась ошибка. Помогите, пожалуйста, ее найти. Заранее благодарен. |
|||
|
||||
| Galaran |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 25.5.2009 Репутация: 1 Всего: 2 |
Регекспом указывается разделитель |
|||
|
||||
| compiler91 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
Хм.. Спасибо, как-то не пришло в голову.
Но все же, наверно, уже больше ради спортивного интереса, как это описать одним регулярным выражением? Galaran-у еще раз спасибо!) |
|||
|
||||
| duk |
|
|||
![]() Some Object ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 19.7.2007 Репутация: 4 Всего: 4 |
Вот, посмотрите. Можно сделать следующим образом:
В таком случае, разделителями может выступать абсолютно все, кроме чисел (и к тому же удовлетворяет Вашему заданию). Это сообщение отредактировал(а) duk - 8.11.2009, 14:49 |
|||
|
||||
| compiler91 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
duk, спасибо за предложенное Вами решение, но, увы, оно не вполне удовлетворяет заданию. Дело в том, что данная парсилка (или парсер?) должна обязательно сигнализировать если существует хотя бы малейшее отклонение от требуемого формата и не в коем случае не пытаться что-либо исправить. Ваш метод легко модернизировать чтобы он удовлетворял условие, например, вырезая полученный substring, а в конце анализируя "остаток", но в таком ключе вариант со split() получается элегантней;)
Это сообщение отредактировал(а) compiler91 - 8.11.2009, 15:11 |
|||
|
||||
| duk |
|
|||
![]() Some Object ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 19.7.2007 Репутация: 4 Всего: 4 |
compiler91, эт я ради Вашего спортивного интереса написал
|
|||
|
||||
| compiler91 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
Чую я это решается с помощью жадных квантификаторов(во!), а применить не могу( |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
Scanner не пробывали использовать для таких целей?
очень клевая штука как по мне ) в свое время лешила кучи головной боли при парсе файлов больших размеров -------------------- SCJP 6 |
|||
|
||||
| compiler91 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
goodday1941, спасибо. Не пробовал.
В данном решении есть интересная особенность - возможна привязка к локали*. *-это помимо возможности чтения из потоков и т.д.) |
|||
|
||||
| lazycat |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 15.7.2007 Репутация: 1 Всего: 1 |
Вы твердо решили использовать именно механизм регулярных выражений?
Дело в том, что их возможности принципиально ограничены. Например, давайте в качестве примера перепишем задачу следующим образом: Массив может содержать не только целые числа, но и числа в формате с фиксированной точкой, а разделителем может выступать не только запятая, но и точка с запятой и даже точка, при этом если разделителем является точка, то после нее обязательно должен следовать пробел. Например, строка может иметь такой вид: 1,56, 336.23;48.22. 11 Правила разбора сформулировать можно, но они слишком сложны для регулярных выражений. Поэтому советую изучить инструмент JavaCC. Придется потратить некоторое время, но зато после этого проблема синтаксического разбор возникать не будет. |
|||
|
||||
| compiler91 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 18.6.2008 Где: Харьков, Украина Репутация: нет Всего: нет |
|
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |