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


Автор: Den1s 24.3.2006, 12:54
Мне надо правильно считать строку "????", т.к. ? - является регулярным выражением то выскакивает ошибка
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)
и т.д.

может есть какой то способ?

Автор: glukochillo 24.3.2006, 13:01
попробуй перед считыванием произвести замену: "?" -> другой символ

Автор: Den1s 24.3.2006, 13:15
а как эту замену сделать то?
пробовал так:

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

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

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

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


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

Автор: LSD 24.3.2006, 14:45
Любой метасимвол можно экранировать с помощью \\.

Если тебе надо искать текст из строки ввода, и не охота заморачиваться с экранированием. Ищи текст так:
Код
    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());

Автор: Den1s 24.3.2006, 14:53
нет, у меня ситуация такая....
Пользователь в поле ввода вводит строку в 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)

программа как бы работает дальше но эту функцию выполняет неправильно....
и вот мне хотелось бы именно узнать как мне эти полученные "????" преобразовать в моей функции в "\\?\\?\\?\\?"...

Автор: LSD 24.3.2006, 15:38
Код
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());

Автор: glukochillo 24.3.2006, 16:25
Еще один вариант:
Код

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

Автор: Den1s 24.3.2006, 17:00
спасибо...это то все понятно...но дело в том что у меня почему то на этих вопросах ошибка срабатывает, он как только считывает что первый вопрос....может не там делаю замену... smile

Автор: Beard 24.3.2006, 17:09
Можно на метод посмотреть, в котором появляется ошибка?

Автор: Den1s 24.3.2006, 17:15
ну вот у меня допустим String поступает, я делаю

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

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

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

Автор: glukochillo 24.3.2006, 17:23
неа, ошибку вызывает replaceAll, так что ищи альтернативу этому методу

Автор: Beard 24.3.2006, 17:25
IndexOf не может вызвать этот эксепшн - это replaceAll, это уже выяснили и предложили как заменить.
Чем способ, предложенный LSD не нравится?

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

так а почему же replaceAll так странно ведет себя в этой ситуации?

Автор: Beard 24.3.2006, 17:52
Потому что он эквивалентен
Код

Pattern.compile("?")...

а там уже читай мануал по регекспам или смотри в код

Автор: Den1s 24.3.2006, 18:13
всё, я понял!!!! smile smile smile

в replaceAll просто надо было к вопросам два обратных слэша добавлять!

Код

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

Автор: dailapu 28.10.2008, 11:43
В какой-то книжке умной читал, автор довал рекомендации:
....Если вы используйте эскайп последовательности,... попробуйте использовать обратный слэш \......Но дальше, этот дядечка, расказал о таком опыте, что невсегда достаточно написать лишь пару слешов, их число для правельного понимания джавой может доходить до 5 штук подряд!?  Почему так происходит он не знает(((

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