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?
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.
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.
Si vous utilisez commons-lang, consultez StringUtils.substringAfter ()
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
}
String[] data = new String("123dance456").split("dance");
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() );