Как удалить «¼» и «½» из строки [дубликата]

На этот вопрос уже есть ответ здесь:

Удаление всех дробных символов, таких как «¼» и «½» из строки 2 ответа

Мне нужно удалить символы "¼" и ½ из строки в Java. Как я могу это сделать?

У меня нет контроля над запросом, я должен принять то, что вводит. В основном строка запроса содержит символы «¼» и ½и мне нужно заменить их пустой строкой.

Я попытался поместить это в список, и это не работало:

invalidChars.add ( '½');

а затем искать через это. Дженкинс жалуется: не отображаемый символ для кодирования ошибок UTF-8 [INFO] 2

 akaIDIOT30 мая 2013 г., 16:06
Ты пытался ?input.replaceAll("1/2", "½")
 Marko Topolnik30 мая 2013 г., 16:27
Да, вы сохраняете исходный код во что-то вроде ISO 8859-1, тогда как Jenkins настроен с UTF-8.
 lurker30 мая 2013 г., 16:17
myString.replaceAll("[\xBC\xBD]", "")
 Jason S30 мая 2013 г., 16:15
вздох. Я исправлен. Вы должны иметь навыки чтения мыслей.
 SOfanatic30 мая 2013 г., 16:07
Вы говорите, что строка должна отображать 1/2 и 1/4, но вместо этого она отображает пустые строки?
 Jason S30 мая 2013 г., 16:14
SLaks: как вы можете вывести это из такого небольшого количества информации из оригинального поста?
 SLaks30 мая 2013 г., 16:06
Звучит как тыпытаемся обойти сломанные кодировки символов. Вы должны исправить вашу систему, чтобы использовать UTF8.

Ответы на вопрос(2)

input = input.replace("\u00BC", "").replace("\u00BD", "");

, , , но я'Я немного подозрительно отношусь к вашему варианту использования. Кажется, это победилоисправить всереальный проблема есть.

 Marko Topolnik30 мая 2013 г., 17:42
Я только что закончил измерения. На строке длиной 800 символов вашreplace на 50% медленнее, чемreplaceAll, что означает, что даже когда я каждый раз компилирую регулярное выражение, оно все равно превосходит ваше решение с большой разницей в строке размером менее 1КБ.
 Marko Topolnik30 мая 2013 г., 18:54
Самый сильный случай, который я имею против замены - это то, что она плохо масштабируется с каждым последующим символом, который нужно удалить.
 ruakh30 мая 2013 г., 16:59
[Продолжение] В целом, поскольку мой подход предполагает копирование всей строки дважды, он может работать немного хуже на очень больших строках, но этоТрудно быть уверенным: количество копий отличается лишь небольшим постоянным коэффициентом, а производительность поиска по линейному регулярному выражению и поиска по подстроке отличается принаименее это такневозможно решитьаприори какой из них окажется быстрее.
 ruakh30 мая 2013 г., 17:19
@MarkoTopolnik: Все это просто мнение. У вас нет доказательств, подтверждающих ваши предположения об эффективности. Возможно, этот код вызывается в очень узком цикле по очень большому количеству очень маленьких строк, и в этом случае моя версия будет более эффективной, чем ваша.
 Marko Topolnik30 мая 2013 г., 17:14
@jasons It 'Один вызов метода против двух и менее символов. Это, очевидно, значительно лучше масштабируется. Интересно, как этоСложнее. Что касается производительности, если она поставляется бесплатно с правильным способом сделать это, отвергнуть это просто выстрелить себе в ногу.
 Marko Topolnik30 мая 2013 г., 17:03
Если мы'Обсуждая производительность, естественно, я предполагаю нетривиальную длину строки. Повторное его повторение, без сомнения, менее эффективно из-за отсутствия кеша. Кроме того, я предполагаю, скомпилированный Regex. Я проверял такие вещи раньше, и разница реальна.
 Marko Topolnik30 мая 2013 г., 17:16
Мой методявляется просто и понятно. Если вы не согласны, этоЭто просто твое мнение против моего.
 ruakh30 мая 2013 г., 18:20
@MarkoTopolnik: Re: "Строка # replace не является ни одной строкой "О, конечно. Ни один из них не является родным кодом. И я'я действительно не спорю с регулярными выражениями; Я часто их использую и подумал об их использовании для ответа, прежде чем решить, чтоreplace будет проще и проще для ОП. Скорее яЯ спорю с претензиями в вашем первоначальном комментарии ("совершенно неэффективно ","гораздо лучший выбор).
 Marko Topolnik30 мая 2013 г., 17:25
Речь идет о обработкезапрос, Это не жесткая петля, но даже если бы это было, я неНе знаю, откуда вы взяли предположение, что регулярные выражения неэффективны.
 Marko Topolnik30 мая 2013 г., 17:18
Это один вызов метода в вашем коде. Я отвечаю на утверждение, что код Regex более сложный.
 Marko Topolnik30 мая 2013 г., 17:21
Что касается общего числа выполненных вызовов методов, вы действительно проверяли обе реализации? Строка # replace не является ни одной строкой.
 ruakh30 мая 2013 г., 16:57
@MarkoTopolnik: Дважды ищите подстроку, а не один раз для поиска класса символов регулярного выражения - чтобы решить, какой из них более эффективен, выЯ должен проверить. (Регулярные выраженияВолшебный, тызнать."[\u00BC\u00BD]" все равно придется сравнивать каждый символ входной строки с обоими возможными значениями.) Выделение строки дважды - ну, обычный способ регулярного выраженияinput.replaceAll("[\u00BC\u00BD]", ""), который должен создатьPattern иMatcher каждый раз, а также строка результата.[Продолжение]
 ruakh30 мая 2013 г., 17:14
@MarkoTopolnik: Вы говорите "Я предполагаю нетривиальную длину строки а также "Я предполагаю, скомпилированный Regex " как будто мы обсуждали это абстрактно, а не обсуждали реальный вариант использования в реальном мире - тот, где выя сделал претензии с такими терминами, как "совсем неэффективно а также "гораздо лучший выбор, Дело в том, что в большинстве случаев этоЛучше писать код самым простым и ясным способом, чем писать его наиболее эффективным способом, потому что в большинстве случаев разница в простоте и ясности больше, чем разница в эффективности.
 Jason S30 мая 2013 г., 16:36
но это'Проще и кому небезразлична эффективность, если строки не огромные.
 Marko Topolnik30 мая 2013 г., 16:24
Это довольно неэффективный способ, так как он будет выполнять двойной поиск и выделять всю строку запроса дважды. Класс символов регулярных выражений - намного лучший выбор.

что строка является переменной, вы можете сделать это

public void asciiReplacer(String str)
{
String[]tmp= str.split(" ");
 for(int i =0; i < temp.length ; i++){
  if(temp[i].equals((char)189)
      temp[i] = " ";
  if(temp[i].equals((char)188)
      temp[i] = " ";
  System.out.println(temp[i]+"\n");
 }
}
 Abhijit Deb30 мая 2013 г., 16:22
Спасибо, ребята, кажется, Lucarnosky 'Идея работает, но мне нужно увидеть, как только я положу ее в SVN, и Дженкинс соберет ее, тогда появится проблема.
 Abhijit Deb30 мая 2013 г., 17:28
Спасибо, ребята, это сработало, и Дженкинс построил его успешно.
 FDinoff30 мая 2013 г., 16:14
Как вы назначаете символ для строки? Теперь, как вы сравниваете String с char с равными?

Ваш ответ на вопрос