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


Автор: jone31 11.8.2009, 20:23
подскажите как посчитать сколько цифр в строке,  и цифры написанные словами(один, два, три...)  тоже

Автор: Joil 11.8.2009, 21:15
jone31, первое что пришло в голову:
Код

public class Main {
    public static int quantity(String str, int digit) {
        String d = "";
        String s = "";
        switch (digit) {
            case 1: {
                s = "один";
                d = "1";
                break;
            }
            case 2: {
                s = "два";
                d = "2";
                break;
            }
            case 3: {
                s = "три";
                d = "3";
                break;
            }
            case 4: {
                s = "четыре";
                d = "4";
                break;
            }
            case 5: {
                s = "пять";
                d = "5";
                break;
            }
            case 6: {
                s = "шесть";
                d = "6";
                break;
            }
            case 7: {
                s = "семь";
                d = "7";
                break;
            }
            case 8: {
                s = "восемь";
                d = "8";
                break;
            }
            case 9: {
                s = "девять";
                d = "9";
                break;
            }
            case 0: {
                s = "нуль";
                d = "0";
                break;
            }
        }
        int q = str.concat(" ").split(d).length - 1;
        q += str.concat(" ").toLowerCase().split(s).length - 1;
        return q;
    }

    public static void main(String[] args) {
        String s = "12345vigr111jie1одинОдинывс1234дватри3";
        System.out.println(quantity(s, 3));
    }
}

Правда написано коряво... но вроде работеает, если надо все цифры найти, то в цикле smile 

Автор: jone31 11.8.2009, 22:30
не, это немного не то. 
короче у меня щас вот так:
Код
msg = msg.replace("ноль","*");
msg = msg.replace("нуль","*");
msg = msg.replace("один","*");
msg = msg.replace("0дин","*");
msg = msg.replace("два","*");
msg = msg.replace("три","*");
msg = msg.replace("четыре","*");
msg = msg.replace("пять","*");
msg = msg.replace("шесть","*");
msg = msg.replace("семь","*");
msg = msg.replace("восемь","*");
msg = msg.replace("в0семь","*");
msg = msg.replace("девять","*");
msg = msg.replace("десять","*");

msg = msg.replace("0","*");
msg = msg.replace("1","*");
msg = msg.replace("2","*");
msg = msg.replace("3","*");
msg = msg.replace("4","*");
msg = msg.replace("5","*");
msg = msg.replace("6","*");
msg = msg.replace("7","*");
msg = msg.replace("8","*");
msg = msg.replace("9","*");


меня это устраивает, но нужно сделать что бы числа от 10 до 20 не заменялись. 

Автор: Joil 12.8.2009, 06:35
jone31, так тебе заменить надо или посчитать. Если посчитать, то тогда как я понимаю ты звездочки (*) считаешь? Если тебя это устраивает, ну и допиши перед этим всем замену чисел от 10 до 20 на решетку (#) допустим. В чем проблема?

Автор: jone31 12.8.2009, 14:32
нет, ты не правильно понял. Корчое этот скрипт пишу для ICQ чата, цель его работы: что бы в чат не отправляли СПАМ, а именно юины других чатов. Мне нужна сделать что бы если в сообщении более 2 цифр, то заменять все на *, если нет то оставить как есть. Тот код что я выше выложил убирает абсолютно все цифры, и получается что если он напишет свой возраст(например: мне 30), то оно заменится на "мне **", вот в чем сложность! smile

Автор: Joil 12.8.2009, 16:35
jone31, вот быстренько накатал опять, правда опять же не очень красиво и замена только цифр (не прописных):
Код

public class NewClass {
    public static String replace(String str, int digit) {
        for (int i = 0; i < str.length() - 1; i++) {
            String symbolPrevious = "";
            if (i != 0) {
                symbolPrevious = str.substring(i - 1, i);
            }
            String symbolCurrent = str.substring(i, i + 1);
            String symbolNext = str.substring(i + 1, i + 2);
            if (symbolCurrent.equals(String.valueOf(digit))) {
                if (!symbolNext.equals("0") && !symbolNext.equals("1") && !symbolNext.equals("2") &&
                    !symbolNext.equals("3") && !symbolNext.equals("4") && !symbolNext.equals("5") &&
                    !symbolNext.equals("6") && !symbolNext.equals("7") && !symbolNext.equals("8") &&
                    !symbolNext.equals("9") && !symbolPrevious.equals("0") && !symbolPrevious.equals("1") &&
                    !symbolPrevious.equals("2") && !symbolPrevious.equals("3") && !symbolPrevious.equals("4") &&
                    !symbolPrevious.equals("5") && !symbolPrevious.equals("6") && !symbolPrevious.equals("7") &&
                    !symbolPrevious.equals("8") && !symbolPrevious.equals("9")) {
                    str = str.substring(0, i) + "*" + str.substring(i + 1, str.length());
                }
            }
        }
        return str;
    }

    public static void main(String [] args) {
        String s = "beh12j1gre7gregh4rie7g77reg99gr42343ej32432n7kl6n8kl777777mjk77";
        for (int i = 0; i < 10; i++) {
            s = replace(s, i);
        }
        System.out.println(s);
    }
}

Вроде работает, осталось только заменить слова smile 

А, не, я тебя опять не правильно понял вроде бы.. (( Короче, если в сообщении более 2х цифр или когда подряд стоит более 2х цифр (вот непонятно).. приведи более подробные примеры и более подробные правила замены?

Автор: jone31 12.8.2009, 17:24
Цитата(Joil @  12.8.2009,  16:35 Найти цитируемый пост)
А, не, я тебя опять не правильно понял вроде бы.. (( Короче, если в сообщении более 2х цифр или когда подряд стоит более 2х цифр (вот непонятно).. приведи более подробные примеры и более подробные правила замены?

если вообще в сообщении более 2 цифр то закрывать звездами.

Например: 
msg = мне 40   <<< цифр < 2 = заменять не нужно
msg = текст 56.42.38.4 текст   <<< цифр > 2 = все цифры заменить на *.

вот что то типо такого фильтра сообщений нужна. smile

Автор: aleksandy 13.8.2009, 11:34
Я думаю надо смотреть в сторону regexp. 
Вот навскидку
Код

"4534 dsgdfg 34.45.67.3".replaceAll("\\d{3,}|[\\d{2}\\.]+", "*")

Автор: jone31 13.8.2009, 12:15
Цитата(aleksandy @  13.8.2009,  11:34 Найти цитируемый пост)
Я думаю надо смотреть в сторону regexp. Вот навскидкукод Java1:"4534 dsgdfg 34.45.67.3".replaceAll("\\d{3,}|[\\d{2}\\.]+", "*")

у меня он вообще скрывает все цифры.

как посчитать сколько всего цифр в сообщении?

Автор: Joil 13.8.2009, 15:36
Цитата(aleksandy @  13.8.2009,  11:34 Найти цитируемый пост)
Я думаю надо смотреть в сторону regexp. 

Тоже думал об этом, но что то ничего путного у меня не получилось smile 
Цитата(jone31 @  12.8.2009,  17:24 Найти цитируемый пост)
Например: 
msg = мне 40   <<< цифр < 2 = заменять не нужно
msg = текст 56.42.38.4 текст   <<< цифр > 2 = все цифры заменить на *.

вот что то типо такого фильтра сообщений нужна. smile

Ну если исходя их примеров, то наверное что то типа того:
Код

public class Main {
    public static int quantity(String str, int digit) {
        String d = "";
        switch (digit) {
            case 1: {
                d = "1";
                break;
            }
            case 2: {
                d = "2";
                break;
            }
            case 3: {
                d = "3";
                break;
            }
            case 4: {
                d = "4";
                break;
            }
            case 5: {
                d = "5";
                break;
            }
            case 6: {
                d = "6";
                break;
            }
            case 7: {
                d = "7";
                break;
            }
            case 8: {
                d = "8";
                break;
            }
            case 9: {
                d = "9";
                break;
            }
            case 0: {
                d = "0";
                break;
            }
        }
        int q = str.concat(" ").split(d).length - 1;
        return q;
    }

    public static String replace(String str) {
        int quantity = 0;
        for (int i = 0; i < 10; i++) {
            quantity += quantity(str, i);
        }
        if (quantity > 2) {
            str = str.replaceAll("1|2|3|4|5|6|7|8|9|0", "*");
        }
        return str;
    }

    public static void main(String[] args) {
        String msgOne = "мне 40";
        String msgTwo = "текст 56.42.38.4 текст";
        System.out.println(replace(msgOne));
        System.out.println(replace(msgTwo));
    }
}


Вот на выходе вроде все как надо:
Код

мне 40
текст **.**.**.* текст


Добавлено через 14 минут и 49 секунд
Если надо заменить не каждую цифру одной звездочкой, а каждую последовательность цифр одной звездочкой, то можно вот так написать:
Код

str = str.replaceAll("([0-9]){1,}", "*");

на выходе:
Код

текст *.*.*.* текст

Автор: dorogoyIV 13.8.2009, 16:14
все не так  smile 
в аське можно написать такое: "привет! 100 лет тебя не слышал!" - уже три цифры подряд идут, еще так: "я 1928 года рождения" - уже четыре цифры...

Автор: jone31 14.8.2009, 18:50
Цитата(dorogoyIV @  13.8.2009,  16:14 Найти цитируемый пост)
все не так   в аське можно написать такое: "привет! 100 лет тебя не слышал!" - уже три цифры подряд идут, еще так: "я 1928 года рождения" - уже четыре цифры...

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

Автор: Joil 14.8.2009, 20:53
jone31,  так UIN может быть 5(используются только администрацией вроде),6,7,8 и 9-значным? почему ты начал с 2х цифр? можно фильтровать по типу xxxxxx, xxx-xxx, xxx xxx, xxxxxxx, xxx-xxx-x, xxx xxx x и т. д. (ну это только предположение)! или я опять че то не понимаю?

Автор: dorogoyIV 15.8.2009, 17:29
Цитата(jone31 @  12.8.2009,  14:32 Найти цитируемый пост)
Корчое этот скрипт пишу для ICQ чата, цель его работы: что бы в чат не отправляли СПАМ, а именно юины других чатов. 

если разобраться, не так уж много этих чатов...
можно их все в статическое поле забить...
т. е. тебе надо будет забить адреса, и делать проверку на них...

Добавлено через 7 минут и 35 секунд
ну и естественно для проги предусмотреть добавление других адресов чатов, что то вроде плагина

Автор: jone31 1.9.2009, 17:06
Цитата(dorogoyIV @  15.8.2009,  17:29 Найти цитируемый пост)
Цитата(jone31 @  12.8.2009,  14:32 )Корчое этот скрипт пишу для ICQ чата, цель его работы: что бы в чат не отправляли СПАМ, а именно юины других чатов. если разобраться, не так уж много этих чатов...можно их все в статическое поле забить...т. е. тебе надо будет забить адреса, и делать проверку на них...Добавлено через 7 минут и 35 секундну и естественно для проги предусмотреть добавление других адресов чатов, что то вроде плагина

этих чатов туева куча...


вообщем я остановилсо на regxp
Код
msg = msg.replaceAll("([0-9]){5,9}", "[UIN]");

код работает, и меня он устраивает. 
Но тут есть одна проблема: работает тока если цифры идут вподряд(1234...), а если нет(1 2 3 4 или 1.2.3.4 ...) то не срабатывает. помогите составить маску что бы и это включить

Автор: jone31 1.9.2009, 17:46
вопрос  пока решен вот так:
Код
msg = msg.replaceAll("(.*[0-9].*){5,}", "[UIN]");

недостаток в том что заменяет полностью сообщение, а не только кусок с цифрами! 

Автор: mgarin 1.9.2009, 18:55
jone31, на самом деле, дело проигрышное пытаться отсеять все варианты

Можно по разному передавать номера, например:
33.OO.O8.I6 - например вполне внятный зашифрованный номер)

Плюс также с цифрами вы в любом случае отсеете много лишнего, как то телефонный номер например,
год рождения, как было приведено выше... Время суток как то 22:00 / 14.52 или даты...

Действительно ли есть толк пытаться отсеять это?

Добавлено через 1 минуту и 52 секунды
P.S. regexp тут тоже не особо поможет (да он укоротит метод замены, но в любом случае будет резать все без разбору подходящее под шаблон)
Если речь действительно идет о системе обмена сообщениями - толку от такой замены в каждом сообщении?..

Автор: jone31 1.9.2009, 19:06
Цитата(mgarin @  1.9.2009,  18:55 Найти цитируемый пост)
jone31, на самом деле, дело проигрышное пытаться отсеять все вариантыМожно по разному передавать номера, например:33.OO.O8.I6 - например вполне внятный зашифрованный номер)Плюс также с цифрами вы в любом случае отсеете много лишнего, как то телефонный номер например,год рождения, как было приведено выше... Время суток как то 22:00 / 14.52 или даты...Действительно ли есть толк пытаться отсеять это?Добавлено через 1 минуту и 52 секундыP.S. regexp тут тоже не особо поможет (да он укоротит метод замены, но в любом случае будет резать все без разбору подходящее под шаблон)Если речь действительно идет о системе обмена сообщениями - толку от такой замены в каждом сообщении?..

верно, я не собираюсь угадывать и отсеивать все варианты.

Юзеры пишут юины в основном в двух формах:
 - Первый - просто тупо цифры(123456789) и админ бот их за это кикает.
 - Второй - между цифрами ставят какой нибудь символ (1.2.3.45.6.78.9) и админ бот ничего не подозревая пропускает их. 

Первый способ побарол, а со вторым пока ничего получается.

Добавлено через 1 минуту и 46 секунд
тот код в последнем моем посте подходить что бы побароть второй способ, но он заменяет все сообщение, вот в этом и загвостка

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