как найти до и после подстроки в строке - PullRequest
22 голосов
/ 15 января 2012

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

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

Ответы [ 6 ]

45 голосов
/ 15 января 2012

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

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

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

18 голосов
/ 15 января 2012

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

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

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

5 голосов
/ 27 марта 2014

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

4 голосов
/ 15 января 2012

Проще всего использовать метод 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
}
1 голос
/ 15 января 2012
String[] data = new String("123dance456").split("dance");
0 голосов
/ 28 февраля 2017

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

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() );   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...