Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите составить регулярное ворожение. 
:(
    Опции темы
unkis
Дата 29.12.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята есть такой вот текст

Код

Berline - Diesel - Annee 2005 - 111 000 km - 25630 Sainte-Suzanne
Break - Diesel - Annee 2003 - 44390 Petit-Mars
Berline - Essence - Annee 1999 - 119 000 km - 25630 Sainte-Suzanne


 из которого нужно получить следующее.
из первого:
Код

group(1) = Berline
group(2) = Diesel
group(3) = 2005
group(4) = 111 000
group(5) = 25630
group(6) = Sainte-Suzanne

из второго 

Код

group(1) = Break
group(2) = Diesel
group(3) = 2003
group(4) = null
group(5) = 44390
group(6) = Petit-Mars


из третьего
Код

group(1) = Berline
group(2) = Essence
group(3) = 1999 
group(4) = 119 000
group(5) = 25630
group(6) = Sainte-Suzanne


Как видно из примера в первой и третей строчки количество параметров(групп) одинаковое, а во второй разное.

Я побывал так но вторая строчка не ловиться
Код

(\\w+).+?\\s(\\w+).+?\\s(\\d+).+?\\s(.+)\\skm\\s-\\s(.+?)\\s(.+?)


Можно ли составить такое выражение, что при отсутствие одной группы это строчка попадало под выражение,а вместо отсутствующей группы возвращалось значения null?



--------------------
www.unkis.com
PM MAIL WWW   Вверх
kemiisto
Дата 29.12.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(unkis @  29.12.2008,  19:51 Найти цитируемый пост)
Можно ли составить такое выражение, что при отсутствие одной группы это строчка попадало под выражение,а вместо отсутствующей группы возвращалось значения null?

 smile 
Вот, накидал на коленках.
Код

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {

    public static void main(String[] args) {
        Pattern pattern =
                Pattern.compile("(\\w+) - (\\w+) - (\\w+) (\\d+) - ((\\d+ \\d+) km - )?(\\d+) ([a-zA-Z0-9-]+)");
        Matcher matcher =
                pattern.matcher("Break - Diesel - Annee 2003 - 44390 Petit-Mars");
        if (matcher.find()) {
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
            System.out.println(matcher.group(4));
            System.out.println(matcher.group(6));
            System.out.println(matcher.group(7));
            System.out.println(matcher.group(8));
        }
    }


Добавлено @ 23:10
Позволю себе пару коментариев:
  • Не злоупотребляйте \s! Это т.н. пробельный символ (короткая запись для [\f\t\n\r]). В Вашем примере могуть быть только пробелы, как я понял. Зачем же усложнять себе жизнь?
  • Не забываем, что в \d не входит тире. Поэтому, если нужно ловить, что-то с тире - [a-zA-Z0-9-].
  • Читаем про квантификаторы. В качестве саморекламы smile - например, тут.


Это сообщение отредактировал(а) kemiisto - 29.12.2008, 23:14


--------------------
PM MAIL WWW GTalk Jabber   Вверх
unkis
Дата 30.12.2008, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



kemiisto, 
Спасибо это то что нужно, и статья как раз то что нужно.
А вот ещё один вопрос а можно это дело усовершенствовать так чтобы оно ещё и такую строчку ловила.

Иногда встречается такое

Berline - Diesel - Annee 2005 - 111 000 km - 25630 Sainte-Suzanne
Berline - Diesel - Annee 2005 - 111 000 km - Sainte-Suzanne 25630

Последнии цифры с буквами поменяны местами, можно ли это как-нибудь отловить, хотя я думаю что это уже не возможно.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
MisterCleric
Дата 30.12.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



(\\w+) - (\\w+) - (\\w+) (\\d+) - (\\d+( \\d+)?) km - (.*?) (.*?)$

Это на случай, если поменяны местами последние группы и если у тебя километры 3-х значные или 6-ти значные.
Еще спрашивал, если каких-то групп не будет: тогда надо решить чего именно не будет? И придется оборачивать еще группами.
А что бы было null. Так это надо изначально забить массив результатов null. А при matcher.group() проставлять в нужную ячейку массива


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Dims
Дата 30.12.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Есть куча "дебаггеров" регулярных выражений, то есть, простеньких программ, которые позволяют вводить выражение и сразу смотреть, как оно работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.