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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с регулярным выражением "?", как считать строку "????" 
V
    Опции темы
Den1s
Дата 24.3.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мне надо правильно считать строку "????", т.к. ? - является регулярным выражением то выскакивает ошибка
java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
????
^
at java.util.regex.Pattern.error(Pattern.java:1528)
at java.util.regex.Pattern.sequence(Pattern.java:1645)
at java.util.regex.Pattern.expr(Pattern.java:1545)
at java.util.regex.Pattern.compile(Pattern.java:1279)
at java.util.regex.Pattern.<init>(Pattern.java:1035)
at java.util.regex.Pattern.compile(Pattern.java:779)
и т.д.

может есть какой то способ?
PM MAIL   Вверх
glukochillo
Дата 24.3.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробуй перед считыванием произвести замену: "?" -> другой символ
PM MAIL   Вверх
Den1s
Дата 24.3.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а как эту замену сделать то?
пробовал так:

if(String.indexOf("?") != -1)
String = String.replaceAll("?","\\?");

но indexOf уже "?" воспринимает как ошибку, т.е. учитывает регулярные выражения.
плюс конечно все таки желательно как то обойтись без замены.

Это сообщение отредактировал(а) Den1s - 24.3.2006, 13:18
PM MAIL   Вверх
LSD
Дата 24.3.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Экранируй его:
Код
System.out.println("???-?-???".replaceAll("\\?", "*"));



--------------------
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   Вверх
Den1s
Дата 24.3.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну "*" это ведь тоже регулярное выражение...и если звездочки будут в поле ввода, то выскочит следующая ошибка


Dangling meta character '*' near index 0 ****
at java.util.regex.Pattern.error(Pattern.java:1528)
at java.util.regex.Pattern.sequence(Pattern.java:1645)
at java.util.regex.Pattern.expr(Pattern.java:1545)
at java.util.regex.Pattern.compile(Pattern.java:1279)
at java.util.regex.Pattern.<init>(Pattern.java:1035)
at java.util.regex.Pattern.compile(Pattern.java:802)


т.е. тут вопрос в том как мне строку "????" принять как "//?//?//?//?" , при том что функции изначально регулярные выражения как exeption воспринимают smile

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


Leprechaun Software Developer
****


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

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



Любой метасимвол можно экранировать с помощью \\.

Если тебе надо искать текст из строки ввода, и не охота заморачиваться с экранированием. Ищи текст так:
Код
    String inputString = "The String class represents character strings? All string literals in Java programs, such as \"abc\", are implemented as instances of this class.";
    String stringToFind = "?";
    String stringToReplace = "!";
    StringBuffer buff = new StringBuffer(inputString);
    int index;
    while((index = buff.indexOf(stringToFind)) != -1)
      buff.replace(index, index + stringToFind.length(), stringToReplace);
    System.out.println(buff.toString());



--------------------
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   Вверх
Den1s
Дата 24.3.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет, у меня ситуация такая....
Пользователь в поле ввода вводит строку в jsp странице, моя функция в файле java эту строку получает, когда пользователь вводит нормальные данные все нормально, но ему захотелось указать что это будет любое слово из 4 букв и он вводит соответственно "????" закрывает окно и в этот момент моя функция получает эти данные, так как первый идет "?"то соотвественно у меня в Eclipse в консоли выскакивает следующие предупреждение

java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
????
^
at java.util.regex.Pattern.error(Pattern.java:1528)
at java.util.regex.Pattern.sequence(Pattern.java:1645)
at java.util.regex.Pattern.expr(Pattern.java:1545)
at java.util.regex.Pattern.compile(Pattern.java:1279)
at java.util.regex.Pattern.<init>(Pattern.java:1035)
at java.util.regex.Pattern.compile(Pattern.java:779)

программа как бы работает дальше но эту функцию выполняет неправильно....
и вот мне хотелось бы именно узнать как мне эти полученные "????" преобразовать в моей функции в "\\?\\?\\?\\?"...
PM MAIL   Вверх
LSD
Дата 24.3.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код
String inputString = "What has happend??? Where I am???";
String stringToFind = "?";
String stringToReplace = "\\?";
int len = stringToFind.length();
StringBuffer buff = new StringBuffer(inputString);
int index = 0;
while((index = buff.indexOf(stringToFind, index)) != -1)
{
  buff.replace(index, index + len, stringToReplace);
  index += len + 1;
}
System.out.println(buff.toString());



--------------------
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   Вверх
glukochillo
Дата 24.3.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Еще один вариант:
Код

String s = new String("????");
        for (int i = 0; i < s.length(); i++)
        {
            if (s.charAt(i) == '?')
            {
                s = s.replace('?','!');
            }
        }

PM MAIL   Вверх
Den1s
Дата 24.3.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо...это то все понятно...но дело в том что у меня почему то на этих вопросах ошибка срабатывает, он как только считывает что первый вопрос....может не там делаю замену... smile
PM MAIL   Вверх
Beard
Дата 24.3.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно на метод посмотреть, в котором появляется ошибка?
PM MAIL   Вверх
Den1s
Дата 24.3.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну вот у меня допустим String поступает, я делаю

if(String.indexOf("?") != -1)
String = String.replaceAll("?","\\?");

и после условия у меня эта ошибка и вылетает....

дело в том что судя по всему indexOf и вызывает этот exception smile

Это сообщение отредактировал(а) Den1s - 24.3.2006, 17:20
PM MAIL   Вверх
glukochillo
Дата 24.3.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



неа, ошибку вызывает replaceAll, так что ищи альтернативу этому методу

Это сообщение отредактировал(а) glukochillo - 24.3.2006, 17:24
PM MAIL   Вверх
Beard
Дата 24.3.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



IndexOf не может вызвать этот эксепшн - это replaceAll, это уже выяснили и предложили как заменить.
Чем способ, предложенный LSD не нравится?
PM MAIL   Вверх
Den1s
Дата 24.3.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, действительно это метод replaceAll этот exception вызывает....странно....
способ предложенный LSD работает, но он более громоздкий....

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

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

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


 




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


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

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