2016-10-25 5 views
0

Вот что я хочу, есть строка типа CHAR_27[19;50H, и я хочу получить номера изнутри отдельно.Java - String.replaceAll возвращает другой результат

// CHAR_27 = Character.toString((char)27); 
// Or "\u001B" 
String escapeString = "CHAR_27[19;50H"; 
String coord = escapeString.replaceAll("[^0-9;]", ""); 
List<String> coords = Splitter.on(";").splitToList(coord); 

if (coords.size() != 2) continue; 

rowIndex = Integer.parseInt(coords.get(0)) - 1; 
colIndex = Integer.parseInt(coords.get(1)) - 1; 

Но иногда оно выбрасывает NumberFormatException, invalid integer CHAR_27[19.

В основном это прекрасно работает.

Есть что-то не так с моим регулярным выражением?

Или я должен использовать StringUtils.removePattern() для получения более последовательного результата?

Я получил этот отчет от Nokia_N1 и GT-810 (rolex). Оба из них - Android 5.1.

И я использую Android API 24.

+2

Ваш шаблон выглядит отлично, если вы хотите удалить все, кроме '0-9' и ';'. Трудно сказать, что не так, не видя [SSCCE] (http://sscce.org)/[MCVE]. Возможно, в какой-то части вашего кода вы просто забыли назначить результат «replaceAll» обратно переменной, как описано здесь: http://stackoverflow.com/questions/12734721/string-not-replacing-characters – Pshemo

+0

Но я просто хочу знаете, почему «одна и та же модель с одним и тем же источником возвращает разные результаты», как описано в заголовке. Есть ли какое-то исключение или что-то, что мне не хватает? В моем вопросе достаточно ясно, что есть пример кода и два разных выхода. –

+0

Возможно, проблема связана с контекстом. Как я уже сказал, трудно сказать, что может пойти не так, без простого, но полного примера, который позволил бы нам воспроизвести этот неправильный результат. Согласно правилам Java это не должно происходить, и я не знаю об ошибках в классах Pattern/Matcher, которые используются здесь внутри (если предположить, что Android делает то же, что и Java) (http://grepcode.com/ файл/repository.grepcode.com/Java/корень/JDK/OpenJDK/8-B132/Java/языки/String.java # String.replaceAll% 28java.lang.String% 2Cjava.lang.String% 29)). – Pshemo

ответ

0

код, который вы вывесили не повысятся упомянутое исключение (если ввод одной строки строка).

Однако ваш код содержит некоторые уязвимости:

  • Orininally отдельные номера могут быть соединены с помощью выражения
  • Пустые строки могут быть созданы

Я бы рекомендовал использовать:

String escapeString = "CHAR_27[19;50H"; 
String[] coords = escapeString.split("[^0-9]+"); 

if (coords.length != 2) continue; 

rowIndex = Integer.parseInt(coords[0]) - 1; 
colIndex = Integer.parseInt(coords[1]) - 1; 
+0

Спасибо за предложение. Но я использовал шаблон для проверки формата escapeString. И я получил этот отчет от пользователя. Я видел это на консоли разработчика Google Play. Я просто не могу понять, почему он не заменен. –

Смежные вопросы