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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярные выражения 
:(
    Опции темы
redwhite90
Дата 29.11.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



почему при попытке распарсить строку с целю получения все пунктуационных знаков таким образом:
Код

all= text.split("[\\w[\\s]]+");


всё хорошо работает Если на первом месте стоит пунктуационный знак, а если нет, то первый элемент массива all становится пустой строй
PM MAIL   Вверх
LSD
Дата 29.11.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата
The array returned by this method contains each substring of the input sequence that is terminated by another subsequence that matches this pattern or is terminated by the end of the input sequence.

Т.е. изначальная позиция в строке 0, ищется первое вхождение шаблона. Если первый знак не пунктуация, то он начинается с 0. Значит первая строка получается от 0 до 0.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
redwhite90
Дата 29.11.2012, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть предложение как можно это исправить?


Цитата(LSD @  29.11.2012,  14:15 Найти цитируемый пост)
Т.е. изначальная позиция в строке 0, ищется первое вхождение шаблона. Если первый знак не пунктуация, то он начинается с 0. Значит первая строка получается от 0 до 0.

Я наверное Вас не так понял. Если пунктуация первый знак- всё классно, если нет - пробел вылезает
PM MAIL   Вверх
LSD
Дата 29.11.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код

    public String[] split(CharSequence input, int limit) {
        int index = 0;
        boolean matchLimited = limit > 0;
        ArrayList<String> matchList = new ArrayList<>();
        Matcher m = matcher(input);

        // Add segments before each match found
        while(m.find()) {
            if (!matchLimited || matchList.size() < limit - 1) {
                String match = input.subSequence(index, m.start()).toString();
                matchList.add(match);
                index = m.end();
            } else if (matchList.size() == limit - 1) { // last one
                String match = input.subSequence(index,
                                                 input.length()).toString();
                matchList.add(match);
                index = m.end();
            }
        }
        ...
    }

Видно, что если find() найдет регион который начинается с 0 символа, то input.subSequence(index, m.start()) даст пустую строку.



Цитата(redwhite90 @  29.11.2012,  15:24 Найти цитируемый пост)
Есть предложение как можно это исправить?

В чем проблема написать код, который будет удалять пустую строку вначале (если есть)?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
redwhite90
Дата 29.11.2012, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Согласен, но думается, что это возможно как то сделать через регулярное положение?
PM MAIL   Вверх
LSD
Дата 29.11.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(redwhite90 @  29.11.2012,  16:16 Найти цитируемый пост)
Согласен, но думается, что это возможно как то сделать через регулярное положение?

И что должно быть в первом элементе?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
redwhite90
Дата 29.11.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



первый элемент - первый знак препинания, встреченный в строке
PM MAIL   Вверх
Kircul
Дата 30.11.2012, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 6
Всего: 7



Не проверял, но должно быть как-то так:
Код

Collection<String> list = new ArrayList<String>(); // or HashSet
for (Matcher m = Pattern.compile("\\p{Punct}").matcher(str); m.find();) {
    list.add(m.group(0));
}

PM   Вверх
Pawl
Дата 30.11.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 28



Я хотел предложить еще такой вариант:
Код

import java.util.ArrayList;

public class PunctsFinder {
    public static void main(String[] args) {
        String str = "qe,qeq,.qe?fe!";    
     ArrayList<String> puncts = new ArrayList<>();;
     for (char c : str.toCharArray()) {
         String p = Character.toString(c);
         if (p.matches("[\\p{Punct}]")) {
             puncts.add(p);
         }
     }    
    }
}

Но вариант Kircul мне понравился больше smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
LSD
Дата 30.11.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(redwhite90 @  29.11.2012,  22:14 Найти цитируемый пост)
первый элемент - первый знак препинания, встреченный в строке 

Вопрос что должно быть с точки зрения контакта метода split(), а не твоей задачи.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
baldina
Дата 30.11.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



split здесь просто не подходит, т.к. предназначен для другого.

Добавлено @ 12:12
но её можно приспособить: в начало строки добавить знак пунктуации и пробел, а результирующий массив обрабатывать начиная с 1

Это сообщение отредактировал(а) baldina - 30.11.2012, 12:14
PM MAIL   Вверх
LSD
Дата 30.11.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(baldina @  30.11.2012,  13:10 Найти цитируемый пост)
но его можно приспособить: в строку первым символом добавить знак пунктуации, а результирующий массив обрабатывать начиная с 1

Знак препинания должен быть с пробелом или еще каким из \w\s символом. Хотя это все равно, чесать левой ухо правой ногой.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
baldina
Дата 30.11.2012, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



верно, буковку надо.
Цитата(LSD @  30.11.2012,  12:22 Найти цитируемый пост)
это все равно, чесать левой ухо правой ногой. 

ну так split() для этой задачи - оно и есть.
тут либо как понятней - match и все такое, либо покороче - split с извращениями (алгоритмисты бы сказали - с преобразованием экземпляра задачи  smile)
PM MAIL   Вверх
LSD
Дата 30.11.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(baldina @  30.11.2012,  13:26 Найти цитируемый пост)
ну так split() для этой задачи - оно и есть.

Есть подозрение, что ТС не устроит ".:;-" одной строкой и захочется получить их по одному.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
baldina
Дата 30.11.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



для этого есть нормальное решение от Kircul, хоть и более длинное
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.1252 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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