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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как делается отрицание слова, регулярные выражения 
:(
    Опции темы
w1nd
Дата 28.2.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Цитата(nornad @  28.2.2007,  23:38 Найти цитируемый пост)
Уверен? Проверял?

Абсолютно уверен. Проверял.

Цитата(nornad @  28.2.2007,  23:38 Найти цитируемый пост)
Может, суть задачи не до конца ясна? Надо проверить строку на то, что в ней не содержится непрерывная последовательность АВ, а не просто два символа А и В.

Предельно ясна. Выражение "\\QAB\\E" как раз и обозначает последовательность "AB".

Код примера:
Код
public class RegexTest {

    public static void main(String... args) {
        String regex = "AB([^\\QAB\\E]*)AB";
        
        test("ABoooooooooooooooooAB", regex);
        test("ABoooooooAooBooooooooooAB", regex);
        test("ABoooooooBAooooooooooAB", regex);
        test("ABoooooooABooooooooooAB", regex);
    }
    
    static void test(String text, String regex) {
        System.out.printf(
            "Текст = \"%s\" %s для \"%s\"\r\n", 
            text, 
            text.matches(regex) ? "подходит" : "не подходит", 
            regex);
    }
    
}


Вывод (java 1.5.0_01):
Код
Текст = "ABoooooooooooooooooAB" подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooAooBooooooooooAB" подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooBAooooooooooAB" подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooABooooooooooAB" не подходит для "AB([^\QAB\E]*)AB"


Это сообщение отредактировал(а) w1nd - 1.3.2007, 00:18


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
nornad
Дата 1.3.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Странно... У меня твой пример даёт такой вот результат:
Код

Текст = "ABoooooooooooooooooAB" подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooAooBooooooooooAB" не подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooBAooooooooooAB" не подходит для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooABooooooooooAB" не подходит для "AB([^\QAB\E]*)AB"

Проверял на jdk6.0

Добавлено @ 01:57 
По идее, внутри [] по правилам регулярных выражений указывается символьный класс, соответствующий одному символу. Не представляю, как у тебя твой пример смог обработать символьный класс как последовательность...


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
corpsehunter
Дата 1.3.2007, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(nornad @ 1.3.2007,  01:55)
Странно... У меня твой пример даёт такой вот результат:

Ничего странного, у меня такой же smile 
Вообще, выражение [^\\QAB\\E] значит любой из символов, кроме \ Q A B \ E  smile И бэкслэш вовсе не обязательно указывать дважды smile  smile 
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
nornad
Дата 1.3.2007, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(corpsehunter @  1.3.2007,  02:49 Найти цитируемый пост)
И бэкслэш вовсе не обязательно указывать дважды

Конечно. Скомпилирую в жабе простейший исходник:
Код

public class RegexTest {
    public static void main(String... args) {
        String regex = "AB([^\QAB\E]*)AB";
    }
}

И посмотри, что тебе скажет жаба. ;)

Добавлено @ 04:42 
corpsehunter, кстати, я не совсем понял, что ты хотел сказать словами
Цитата(corpsehunter @  1.3.2007,  02:49 Найти цитируемый пост)
Вообще, выражение [^\\QAB\\E] значит любой из символов, кроме \ Q A B \ E

Это ты мне объяснял или w1nd'у?
\QAB\E - любая последовательность не АВ
[\QAB\E] - любой один символ, кроме А и В.
А мои слова относились к тому, что я не понимаю, каким образом на jdk1.5.0_01 это дело работало не как символьный класс, а как последовательность.

Добавлено @ 04:45 
Всё, дошло, что ты имел в виду. smile
Если ты заметил, в коде [^\\QAB\\E] взято в кавычки.  smile  А в тексте для упрощения пишем часто без кавычек.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
w1nd
Дата 1.3.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Цитата(nornad @  1.3.2007,  01:55 Найти цитируемый пост)
По идее, внутри [] по правилам регулярных выражений указывается символьный класс, соответствующий одному символу. Не представляю, как у тебя твой пример смог обработать символьный класс как последовательность...

Да, с символьным типом я обмишурился. Значит в пятёрке баг в реализации regexp...



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
corpsehunter
Дата 1.3.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(nornad @ 1.3.2007,  04:34)

\QAB\E - любая последовательность не АВ

Т.е. это тоже самое, что и [^A][^B]?
Цитата(nornad @ 1.3.2007,  04:34)

[\QAB\E] - любой один символ, кроме А и В.

А это - [^AB]?

Просто в первом примере стоял двойной бэкслэш, а это в регулярном выражении значит одинарный слэш, а тут ты уже поставил одинарный smile
Да и вообще, я раньше не слышал про \Q...\E, шаз прочитал в доке - там написано, что все, что заключено в них просто экранируется бэкслэшем. Че-то несостыковочка какая-то...
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
_program_seeker
Дата 1.3.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



w1nd, спасибо, твой пример я проверил на свежую голову и действительно все работает! я немного изменил только твою программу, и добавил пару тестовых строк, и вот что получилось:

программа (jdk_1.5.0_8):
Код

public static void main(String[] args) {

        String regex = "AB([^\\QAB\\E]*)AB";

        String t = "";
        test(t + "ABooooooooooooooooooooAB" + t, regex);
        test(t + "ABoooooooAooBoooooooooAB" + t, regex);
        test(t +"ABoooooooBAoooooooooooAB" + t, regex);
        test(t +"ABoooooooBooAoooooooooAB" + t, regex);
        test(t +"ABooooooooooAoooooooooAB" + t, regex);
        test(t +"ABooooooooooBoooooooooAB" + t, regex);
        test(t +"ABoooooooABoooooooooooAB" + t, regex);
        test(t +"ooooooooooooooooooooooooo" + t, regex);
}

static void test(String text, String regex) {
        System.out.printf(
                "Текст = \"%s\" %s для \"%s\"\r\n",
                text,
                text.matches(regex) ? "\t\tподходит\t" : "\t\tне подходит\t",
                regex);
}


я добавил переменную t для того чтобы можно было обрамлять строки теста дополнительными незначащими символами, для чего это сделано - будет видно чуть позже.
Вначале я провел тест при значении переменной t = "", и вот результаты:
Код

Текст = "ABooooooooooooooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooAooBoooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooBAoooooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooBooAoooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABooooooooooAoooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABooooooooooBoooooooooAB"        подходит     для "AB([^\QAB\E]*)AB"
Текст = "ABoooooooABoooooooooooAB"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooooooooooooooooooooooooo"        не подходит     для "AB([^\QAB\E]*)AB"

на этом наборе тестов паттерн, предложенный w1nd, работает превосходно.
а вот когда я провел тесты но при значении переменной t = "oo" то получил результаты которые не поддаются логике:

Код

Текст = "ooABooooooooooooooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABoooooooAooBoooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABoooooooBAoooooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABoooooooBooAoooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABooooooooooAoooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABooooooooooBoooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooABoooooooABoooooooooooABoo"        не подходит     для "AB([^\QAB\E]*)AB"
Текст = "ooooooooooooooooooooooooooooo"    не подходит     для "AB([^\QAB\E]*)AB"


почему так? ведь паттерн не ограничивается строкой, в нем нет начального ^ и завершающего $ символа?

Это сообщение отредактировал(а) _program_seeker - 1.3.2007, 17:50
PM MAIL   Вверх
nornad
Дата 1.3.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(corpsehunter @  1.3.2007,  15:10 Найти цитируемый пост)
Т.е. это тоже самое, что и [^A][^B]?

Нет. [^A][^B] - два последовательных символа, но первый не А, а второй не В.
\QAB\E - последовательность любой величины, лишь бы это не была последовательность АВ.

Цитата(corpsehunter @  1.3.2007,  15:10 Найти цитируемый пост)
Цитата(nornad @ 1.3.2007,  04:34)
[\QAB\E] - любой один символ, кроме А и В.

А это - [^AB]?

Да.

Цитата(_program_seeker @  1.3.2007,  17:34 Найти цитируемый пост)
почему так? ведь паттерн не ограничивается строкой, в нем нет начального ^ и завершающего $ символа?

Потому что String.matches работает не совсем так, как обычный паттерн-матчинг. Часто он считает, что твой шаблон должен подходить именно для всей строки. Я бы сказал, что это всегда так, но сам пару раз столкнулся с необходимостью явно указать ^$.
Кстати, раз уж ты пишешь в пятой жабе, то учти, что этот же код в шестой жабе уже будет работать иначе. О причине читай выше.

Добавлено @ 18:06 
Хотя, насчёт \QAB\E могу ошибаться - мало сталкивался.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
corpsehunter
Дата 1.3.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня в первом случае все равно не так получается. Во втором так же. Версия 1.6.0
И вообще, не понимаю, почему у тебя так получается и откуда взяли, что \Q…\E обозначает последовательность:
Цитата

\Q…\E - обозначает, что все метасимволы в регулярном выражении между \Q и \E экранируются при помощи символа “\”;

P.S. Со количеством слэшэй я накосячил - перепутал с пхп - там используется одиночный...
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
nornad
Дата 1.3.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Спасибо, что напомнил. Итого получаем, что \QАВ\E === АВ, а [^\QАВ\E] === [^АВ].


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
sova7
Дата 2.3.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчет поиска фраз "без слова водка" - так понял, решение не найдено ?
Из решений обратной задачи для "ABooAooBooAB" можно предложить 
Код

        String regex = "(AB.*){3}";
        
        String[] ar = new String[]{
             "ABoooooooooooooooooAB",
             "ABoooooooAooBooooooooAB",
             "ABoooooooBAooooooooooAB",
             "ABoooooooABooooooooooAB"};

        for (int i = 0; i < ar.length; i++) {
         String text = ar[i];
         System.out.println(text + "\t\t" + text.matches(regex));
        }


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

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

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


 




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


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

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