2015-05-29 3 views
1

Я пытаюсь извлечь 00 и 02 из строки ниже в Строки.Извлечение двух подстрок из одной строки

invokestatic:indexbyte1=00 indexbyte2=02 

Я использую этот код, но он не работает правильно:

String parse = "invokestatic:indexbyte1=00 indexbyte2=02"; 

String first = parse.substring(check.indexOf("=") + 1); 
String second= parse.substring(check.lastIndexOf("=") + 1); 

Это похоже на работу для строки секунд, но первое значение строки является

00 indexbyte2=02 

Я хочу чтобы поймать только две цифры, а не остальную часть строки.

+0

Шаг 1: Разделить на пробелы. Шаг 2: Разделить на '='. –

+1

@Dawson Вам нужно указать 'substring()' когда остановиться. – Biffen

+0

Является ли формат всегда одинаковым? Если это так, вы можете использовать регулярное выражение с 'Pattern' и' Matcher'. – Thomas

ответ

2

Если вы не укажете второй параметр в методе подстроки, это приведет к подстроке от начального индекса до конца строки, поэтому вы получите «00 indexbyte2 = 02» для first.

Укажите последний индекс только для извлечения из двух цифр, когда вы извлекаете значение для first

String first = parse.substring(check.indexOf("=") + 1, check.indexOf("=") + 3); 
+0

Спасибо, что работает – Dawson

1

Попробуйте это:

String first = parse.substring(check.indexOf("=") + 1, check.indexOf("=") + 3); 

check.indexOf("=") + 3 примет 02 и будет endindex для подстроки. В настоящее время вы не указываете endindex, следовательно, он принимает indexbyte2=02, так как подстрока не знает, где остановиться, поэтому она анализирует до конца.

1
String parse = "invokestatic:indexbyte1=00 indexbyte2=02"; 

     String first = parse.substring(parse.indexOf("=") + 1, 
       parse.indexOf("=") + 3); 
     String second = parse.substring(parse.lastIndexOf("=") + 1); 
     System.out.println(first + ", " + second); 
2

Вы можете использовать шаблон регулярного выражения с группами, как это:

public static void main(String[] args) { 
    String input = "invokestatic:indexbyte1=00 indexbyte2=02"; 

    Pattern pattern = Pattern.compile(".*indexbyte1=(\\d*) indexbyte2=(\\d*)"); 
    Matcher m = pattern.matcher(input); 
    if (m.matches()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
    } 
} 
0

Если вход имеет основную форму invokestatic:indexbyte1=00 indexbyte2=02 ... indexbyte99=99 вы могли бы использовать регулярное выражение:

Pattern p = Pattern.compile("indexbyte\\d+=([a-fA-F0-9]{2})"); 
Matcher m = p.matcher(input); 
while(m.find()) { 
    String idxByte = m.group(1); 
    //handle the byte here 
} 

Это предполагает, что идентификатор для этих байтов - indexbyteN, но это может быть заменено другим идентификатором. Далее это предполагает, что байты предоставляются в шестнадцатеричном виде, то есть 2 шестнадцатеричных символа (здесь не учитывается регистр).

1

Вы можете использовать Pattern, Matcher clases.

Matcher m = Pattern.compile("(?<==)\\d+").matcher(string); 
while(m.find()) 
{ 
System.out.println(m.group()); 
} 
Смежные вопросы