2012-01-15 2 views
18

У меня есть строка 123dance456, которую мне нужно разделить на две строки, содержащие первую подстроку, перед подстрокой dance (т.е. 123) и после того, строка dance (т.е. 456). Мне нужно найти их и удерживать их в отдельных строковых переменных, например String firstSubString = 123; и String secondSubString = 456;.как найти до и после подстроки в строке

Есть ли какой-либо метод String, который делает именно это?

+0

Это можно сделать, но какой именно формат ??? Я имею в виду, что танец всегда будет там? –

+0

@ dku.rajkumar: Да, подстрока «танец» всегда будет там. 'split()' должен делать трюк. Я должен был представить себе такой метод. Я думал, что мне, возможно, придется написать для него регулярное выражение.Спасибо :) – skip

+0

, тогда нет необходимости в регулярном выражении, просто используйте String [] str =; string.split («dance»); как уже упоминалось, ответы –

ответ

39

Вы можете использовать String.split(String regex). Просто сделать что-то вроде этого:

String s = "123dance456"; 
String[] split = s.split("dance"); 
String firstSubString = split[0]; 
String secondSubString = split[1]; 

Пожалуйста, обратите внимание, что если "dance" встречается более чем один раз в исходной строке, split() разделится в каждом случае - именно поэтому возвращаемое значение является массивом.

16

Вы можете сделать это:

String str = "123dance456"; 
String substr = "dance"; 
String before = str.substring(0, str.indexOf(substr)); 
String after = str.substring(str.indexOf(substr) + substr.length()); 

Или

String str = "123dance456"; 
String substr = "dance"; 
String[] parts = str.split(substr); 
String before = parts[0]; 
String after = parts[1]; 

Стоит отметить, что второй ответ не будет работать, если у нас есть более чем одно вхождение подстроки. С этой целью, если только мы хотим, чтобы первый один быть признаны, было бы безопаснее вызвать раскол с лимитом:

String[] parts = str.split(substr, 2); 

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

Чтобы сделать первый ответ более эффективным - как это мой предпочтительный ответ - то, мы должны помнить о позиции подстроки:

final int position = str.indexOf(substr); 
if (position >= 0) { 
    //if the substring does occur within the string, set the values accordingly 
    before = str.substring(0, position); 
    after = str.substring(position + substr.length()); 
} else { 
    //otherwise, default to the empty string (or some other value) 
    before = ""; 
    after = ""; 
} 

Он всегда платит, чтобы обратить внимание на эти маленькие краевые случаи.

+0

'parts' были бы' String [] ' –

+0

Не разделили бы массив? –

+0

Да, это было бы плохо. –

4

Проще всего использовать метод split, как предлагают другие ответы. Вы можете также использовать Matcher и Pattern для более общего подхода:

String str = "123dance456"; 
String splitter = "dance"; 
Pattern p = Pattern.compile("(.*?)" + splitter + "(.*)"); 
Matcher m = p.matcher(str); 
if (m.matches()) { 
    firstSubString = m.group(1); // may be empty 
    secondSubString = m.group(2); // may be empty 
} else { 
    // splitter not found in str 
} 
4

Если вы используете Викисклада языки см StringUtils.substringAfter()

0

Использование сканера является хорошей альтернативой:

Scanner scanner = new Scanner("123dance456").useDelimiter("dance"); 
if (scanner.hasNext()) 
    System.out.println(scanner.next()); 
if (scanner.hasNext()) 
    System.out.println(scanner.next()); 

Очень удобно обрабатывать токены как поток и просто спросить через hasNext(), если доступны новые токены. Также вы получаете хорошие конверсии из Scanner, даже локализованные, например:

Scanner scanner = new Scanner("123dance456").useDelimiter("dance"); 
System.out.println(scanner.nextDouble() * scanner.nextDouble());