Подтвердить что ты не робот

Как найти до и после подстроки в строке

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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];

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

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 = "";
}

Всегда стоит обратить внимание на эти случаи с маленькими краями.

Ответ 3

Проще всего использовать метод 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

Если вы используете commons-lang, см. StringUtils.substringAfter()

Ответ 5

String[] data = new String("123dance456").split("dance");

Ответ 6

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

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() );