crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Удаление скобок, с содержимым
RazrFalcon
  опции профиля:
сообщение 8.12.2011, 12:12
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Примеры:
[1234][1234]text[1234][1234]
[1234] [1234] text [1234] [1234]
[1234][1234] text [1234][1234]
etc.

Во всех случаях должен остаться только text. Все что в скобках и сами скобки нужно удалить.

Какие есть варианты?
Сейчас использую QRegExp, но думаю есть более простые способы.
    QString name("[1234][1234] text [1234][1234]");
    name.remove(QRegExp(" \\[.*\\]")); // may be ' \\[.*\\]$'
    QRegExp rx1("\\[.*\\]$");
    int pos1 = 0;
    QString rmStr;
    while (pos1 >= 0) {
        pos1 = rx1.indexIn(name,pos1);
        if (pos1 >= 0) {
            ++pos1;
        }
        qDebug()<<rx1.capturedTexts();
        QString tmpStr = rx1.capturedTexts().first();
        if (!tmpStr.isEmpty() && tmpStr.count() > rmStr.count() && tmpStr != name)
            rmStr = rx1.capturedTexts().first();
    }
    name.remove(rmStr);
    name.remove(QRegExp("\\[.*\\]"));
    qDebug()<<name;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 8.12.2011, 17:46
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Если в скобках могут быть только цифры, то вместо всего этого используй одну строку:
 name.remove(QRegExp("\\s*\\[\\d+\\]\\s*"));

Если не только цифры, то напиши что, подумаем. Но по любому код будет проще твоего.

Сообщение отредактировал Sokoloff - 8.12.2011, 17:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2011, 18:12
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


QString Parcer::bracketsRemove(QString &name)
{
    QRegExp rx("\\[.*\\]|\\(.*\\)");
    int pos = 0;
    // find all [text] and (text)
    while (name.contains(QRegExp("\\[.*\\]|\\(.*\\)"))) {
        pos = 0;
        QString rmStr;
        // find last brackets
        while (pos >= 0) {
            pos = rx.indexIn(name,pos);
            if (pos >= 0) {
                ++pos;
            }
            QString tmpStr = rx.capturedTexts().first();
            if (!tmpStr.isEmpty())
                rmStr = tmpStr;
        }
        // remove finded brackets from base name
        name.remove(rmStr);
    }
    // remove rest of brackets
    name.remove(QRegExp("\\[|\\]|\\(|\\)"));
    return name;
}

Вот как сейчас работает. И работает как надо. Но это мой вариант решения. Может есть проще.
В скобках может быть что угодно, вообще без ограничений. Что я и реализовал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 8.12.2011, 18:26
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 8.12.2011, 19:12) *
Вот как сейчас работает. И работает как надо. Но это мой вариант решения. Может есть проще.
В скобках может быть что угодно, вообще без ограничений. Что я и реализовал.

Я верю что он работает, но уж больно он длинный.
Попробуй
    QString s;
    QRegExp re = QRegExp("\\s*\\[[^\\[]*\\]\\s*");

    s="[тект][1234]text[1234][1234]";
    qDebug() << s.remove(re);

    s="[Some ELSE 1234] [1234] text [1 2 3 4] [1234]";
    qDebug() << s.remove(re);

    s="[1.;& Text][1234] text [1234][1234]";
    qDebug() << s.remove(re);[1234]";

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2011, 19:50
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


ППЦ... Пашет! Как?!

Большое спасибо.
И можно ли расшифровку увидеть. А то что-то не совсем понял работу его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 8.12.2011, 20:39
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 8.12.2011, 20:50) *
ППЦ... Пашет! Как?!

Большое спасибо.
И можно ли расшифровку увидеть. А то что-то не совсем понял работу его.

Да регэкспы это жесть :)
Для читаемости двойные слеши я уберу, это чисто сишная фишка.

Здесь засада с жадностью выражений. По умолчанию квантификаторы жадные, и они будут хватать самую первую и последнюю скобки. Т.е. в "текст[123]text[567][890]" выражение "\[.*\]" хапнет все от первой до последней скобок - "тект[123]text[567][890]". Это можно изменить используя QRegExp::setMinimal, но не в нашем случае. Нам нужны и не жадные квадратные скобки, и жаднючие "\s*". Поэтому приходится извращаться.

Я буду идти от краев к центру.
\s*\[[^\[]*\]\s*
\s* - 0 или более пробельных символов перед и после патерна.

\[[^\[]*\]
\[ и \] - Квадратные скобки именно как символы, в отличие от следующего пункта. Если перед символом стоит слеш, мы говорим, что это обычный символ а не спецсимвол.

[^\[]*
* - 0 или более повторений предыдущего шаблона.

[^\[]
[ и ] - Без слешей означают перечисление символов. Например [АБВ] - один символ или А, или Б, или В.

^\[ - Скобка "\[", но перед ней стоит отрицание "^". Т.е. любой символ кроме квадратной скобки.

Что получилось в итоге:
Ищем последовательность начинающуюся и заканчивающуюся скобками, но внутри последовательности открывающей скобки быть не должно. Перед и после нее могут быть пробелы.

P.S. А как этот регэксп смотрится с BB-кодами, вообще сказка:)

Сообщение отредактировал Sokoloff - 8.12.2011, 20:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2011, 20:53
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Спасибо.
С regexp хорошо знаком. Но такой вариант не осилил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 2:14