web-dev-qa-db-fra.com

comment trouver avant et après sous-chaîne dans une chaîne

J'ai une chaîne appelée 123dance456 que je dois scinder en deux chaînes contenant la première sous-chaîne avant la sous-chaîne dance (i.e. 123) et après la sous-chaîne dance (i.e. 456). J'ai besoin de les trouver et de les conserver dans des variables de chaîne séparées, par exemple String firstSubString = 123; et String secondSubString = 456;.

Existe-t-il une méthode String qui fait exactement cela?

22
skip

Vous pouvez utiliser String.split(String regex) . Faites juste quelque chose comme ça:

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

Veuillez noter que si "dance" apparaît plusieurs fois dans la chaîne d'origine, split() sera divisé à chaque occurrence - c'est pourquoi la valeur de retour est un tableau.

44
Alex D

Tu peux le faire:

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

Ou

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

Il est à noter que la deuxième réponse ne fonctionne pas si nous avons plus d'une occurrence de la sous-chaîne. À cette fin, si nous souhaitons seulement que le premier soit reconnu, il serait plus prudent d’appeler le fractionnement avec une limite:

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

ce qui garantit que le tableau retourné a au plus deux éléments. De plus, puisque split interprétera son entrée comme une expression régulière, nous devons nous méfier de la syntaxe d’expression régulière non valide. En tant que tel, je préférerais de loin la première solution, car elle fonctionne quelle que soit la composition de la sous-chaîne d'origine.

Pour que la première réponse soit plus efficace - c'est la réponse que je préfère -, nous devrons alors nous rappeler la position de la sous-chaîne:

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

Il est toujours utile de faire attention à ces petites affaires Edge.

18
Milad Naseri

Si vous utilisez commons-lang, consultez StringUtils.substringAfter ()

5
Constantine Gladky

Le plus simple est d’utiliser la méthode split comme le suggèrent les autres réponses. Vous pouvez également utiliser un Matcher et un Pattern pour une approche plus générale:

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
Ted Hopp
String[] data = new String("123dance456").split("dance");
1
kcdragon

Utiliser le scanner est une alternative intéressante:

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

Il est très pratique de traiter les jetons sous forme de flux et de demander simplement via hasNext() si de nouveaux jetons sont disponibles. Aussi, vous obtenez des conversions de Nice à partir de la Scanner, même localisée, comme:

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