Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Работа со строками


Автор: barin_Student 25.1.2008, 08:36
Есть строки вида:
----------------------------------------------------------------------
1- +cmgl: 2,"status","telephone"yy/mm/dd(Date).hh.mm.ss"mls(time)
2 -  text
3 - 
4 - status1
----------------------------------------------------------------------
--- это просто я разделил, пакет ответа...
Для начала я ложу в строку
1 String[0]
2 String[1]
3 String[2]
4 String[3]
Создаю так:
String[] stroki = new String[3];
в методе строки заполняются...
потом для разбора нужной инфы , я уже сломал голову, как мне вытащить из этих строк :
telephone,Date, time, text, status1? Помогите пожалуйста , а то чета голова не варит, сори за притивизм, smile 

Автор: Ulysses4j 25.1.2008, 08:51
Цитата
1- +cmgl: 2,"status","telephone"yy/mm/dd(Date).hh.mm.ss"mls(time)

А тут действительно кавычки непарные? Вообще, какой-то не очень регулярный формат, я бы на вашем месте в первую очередь попробовал его словами описать: после "1 - " всегда идет значение с лидирующим "+" и единственно ли оно или может быть несколько (тоже с плюсами или без?).

Автор: barin_Student 25.1.2008, 08:58
Вопщем вот первая строка как есть так и напишу:

+CMGL: 2,"READ","+7777****","08/01/25,11:57:55+34"

где 
"8777***" - telephone
и тд....

Автор: nornad 25.1.2008, 09:52
Регулярными выражениями из строки можно вытащить всё, что тебе надо. Вот выражение:
Код

.*:\s*\d+\s*,\s*".*"\s*,\s*"([+]?\d+)"\s*,\s*"(\d{1,4}/\d{1,2}/\d{1,2}),(\d{1,2}:\d{1,2}:\d{1,2})[+](\d{1,3})"

Первая группа - телефон (с плюсом, если есть; пробелов и тире в номере быть не должно)
Вторая группа - дата (гггг/мм/дд, гг/мм/дд или вообще г/м/д)
Третья группа - время (чч/мм/сс)
Четвёртая группа - миллисекунды (если надо).
Если никогда не использовал регулярные выражения и не в курсе, что это - поищи темы на форуме, тут много чего уже говорили.
Классы для работы с регулярками - Pattern и Matcher.

Автор: barin_Student 25.1.2008, 11:12
А если просто резать строку?

Автор: v2v 25.1.2008, 11:19
резать тебе никто не запрещает, но меьчайшие изменения в структуре твоей строки и прощай резалка.
попробуй всё таки использовать http://j2w.blogspot.com/2008/01/java.html

Автор: barin_Student 25.1.2008, 11:34
Спасибо за ссылку , сижу читаю..... smile 

Автор: barin_Student 25.1.2008, 11:59
Прочитал , но доконца не понял....
Если можно какой нить пример с импортом, тока не с почтовыми адресами... Я был бы очень вам благодарен... smile 

Автор: v2v 25.1.2008, 12:07
barin_Student,  вот теперь прочитай ещё раз пост nornadа

Автор: barin_Student 25.1.2008, 12:21
.*:\s*\d+\s*,\s*".*"\s*,\s*"([+]?\d+)"\s*,\s*"(\d{1,4}/\d{1,2}/\d{1,2}),(\d{1,2}:\d{1,2}:\d{1,2})[+](\d{1,3})"
Так где здесь первая группа , а где вторая?...

Pattern p = Pattern.compile(.*:\s*\d+\s*,\s*".*"\s*,\s*"([+]?\d+)"\s*,\s*"(\d{1,4}/\d{1,2}/\d{1,2}),(\d{1,2}:\d{1,2}:\d{1,2})[+](\d{1,3})"

А дальше что , я просто не вижу вибиваний.. я вижу сравнения и все.... smile 

Автор: LSD 25.1.2008, 12:37
Цитата(barin_Student @  25.1.2008,  12:21 Найти цитируемый пост)
Так где здесь первая группа , а где вторая?

Группа это то, что стоит в скобках. Например первая это ([+]?\d+).

Автор: barin_Student 25.1.2008, 12:43
Ладно есть там группа , то что в скобках , а как ее (нужную группу) , вырезанную положить в переменную?.. Просто не могу понять .. грипп.. но по сети не заразно! smile 

Автор: LSD 25.1.2008, 12:49
Код

    Pattern pattern = Pattern.compile("some pattern");
    Matcher matcher = pattern.matcher("some string");
    while(matcher.find())
    {
      String group1 = matcher.group(1);
    }

Автор: nornad 25.1.2008, 13:13
Кроме того, как я уже говорил - на форуме достаточно тем, в которых обсуждались регулярные выражения и методы работы с ними. Нужно лишь провести небольшой поиск. Кстати, в самом низу страницы есть список схожих по содержанию тем - даже и искать не всегда требуется. smile 

Автор: barin_Student 25.1.2008, 13:24
Это примерно так выглядит?:
 Pattern pattern = Pattern.compile("([+]?\d+)");
    Matcher matcher = pattern.matcher("+CMGL: 2,"READ","+7777****","08/01/25,11:57:55+34"
");
    while(matcher.find())
    {
      String telephone = matcher.group(1);// а что такое matcher.group(1)?
    }
правильно?

Добавлено через 3 минуты и 16 секунд
Посмотрел все что в поиске вышло , там не мои проблемы затрагивали, восновном речь в тех темах шла о ошибках...

Автор: LSD 25.1.2008, 13:35
Нет, в качестве паттерна используй все выражение:
Код

    Pattern pattern = Pattern.compile(".*:\\s*\\d+\\s*,\\s*\".*\"\\s*,\\s*\"([+]?\\d+)\"\\s*,\\s*\"(\\d{1,4}/\\d{1,2}/\\d{1,2}),(\\d{1,2}:\\d{1,2}:\\d{1,2})[+](\\d{1,3})\"");
    Matcher matcher = pattern.matcher("+CMGL: 2,\"READ\",\"+12345678\",\"08/01/25,11:57:55+34\"");
    while(matcher.find())
    {
      int groups = matcher.groupCount();
      for(int i = 1; i <= groups; i++)
      {
        System.out.println("group " + i + " = " + matcher.group(i));
      }
    }


И научить уже тегами Код пользоваться!

Автор: barin_Student 25.1.2008, 13:42
Большие пасибки за помощь, счас проверять буду...
Гриппую вот и туплю.... smile 

Автор: nornad 25.1.2008, 14:07
Цитата(barin_Student @  25.1.2008,  16:24 Найти цитируемый пост)
Посмотрел все что в поиске вышло , там не мои проблемы затрагивали, восновном речь в тех темах шла о ошибках... 

Там есть примеры использования регулярок и частичное описание паттернов.
Цитата(barin_Student @  25.1.2008,  16:24 Найти цитируемый пост)
Это примерно так выглядит?:

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

Автор: barin_Student 28.1.2008, 12:04

Попробовал , если есть строка вот такого вида:

Код

Pattern pattern = Pattern.compile(".*:\\s*\\d+\\s*,\\s*\".*\"\\s*,\\s*\"([+]?\\d+)\"\\s*,\\s*\"(\\d{1,4}/\\d{1,2}/\\d{1,2}),(\\d{1,2}:\\d{1,2}:\\d{1,2})[+](\\d{1,3})\"");
    Matcher matcher = pattern.matcher("+CMGL: 2,\"READ\",\"+12345678\",\"08/01/25,11:57:55+34\"");

а как мне выделить нужный блок когда таков:
Код

Pattern pattern = Pattern.compile(".*:\\s*\\d+\\s*,\\s*\".*\"\\s*,\\s*\"([+]?\\d+)\"\\s*,\\s*\"(\\d{1,4}/\\d{1,2}/\\d{1,2}),(\\d{1,2}:\\d{1,2}:\\d{1,2})[+](\\d{1,3})\"");
    Matcher matcher = pattern.matcher("+CMGL: 2,"READ","+7777****","08/01/25,11:57:55+34"
);


Вопщем строка то у меня такая:
+CMGL: 2,"READ","+7777****","08/01/25,11:57:55+34"

а не такая:

+CMGL: 2,\"READ\",\"+12345678\",\"08/01/25,11:57:55+34\
Не могу разобраться..... помогите пожалуйста. smile 

Автор: barin_Student 28.1.2008, 12:53
А если воспользоваться StringTokenizer, ведь там считаются но и разбиваются слова? Только я незнаю как запятаю там заносииться в качесве разделителя?

Автор: LSD 28.1.2008, 13:03
Код

StringTokenizer tokenizer = new StringTokenizer("some string", ",");

Автор: nornad 28.1.2008, 13:05
То есть у тебя в номере телефона хранятся звёздочки?
Замени тогда ([+]?\\d+) на ([+]?[*\\d]+).

Автор: barin_Student 28.1.2008, 13:28
Я решил эту проблему(парсинга), есть вопрос , если я разделил элементы StringTokenizer"oм, то как мне эти элементы в строку перевести?
Из StringTokenizer в String?

Увидел что вы уже отписали... сори не смотрел...))
Вот по этой ссылке я про переводы в String ничаго не нашел:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html#StringTokenizer(java.lang.String,%20java.lang.String)

Автор: LSD 28.1.2008, 13:32
barin_Student, и давай ты уже все таки начнешь читать документацию, а не спрашивать по каждому вопросу на форуме? В доке по StringTokenizer в самом начале есть пример его использования.

Автор: barin_Student 28.1.2008, 13:45
Вот увидел... метод...
все спасибо за помощь , тема закрыта.......)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)