J'ai une chaîne telle que:
String sub = test1.substring(test1.indexOf("/ws/"), test1.lastIndexOf("/"));
System.out.println("Substring: " + sub);
Je veux que la sortie de la sous-chaîne pour les deux chaînes ci-dessus soit /ws/list
De / ws / au premier / ou à la fin de la chaîne s'il n'y a pas de /
String test1 = "https://31.191.110.125:443/App/ws/list/play"; String test2 = "https://31.191.110.125:443/App/ws/list";
Ce qui précède fonctionne pour la chaîne test1, mais pas pour la chaîne test2. Comment puis-je faire cela pour la chaîne test2?
4 Réponses :
Vous pouvez isoler les index puis utiliser un opérateur ternaire, par exemple:
int idx1 = test1.indexOf("/ws");
int idx2 = test1.lastIndexOf("/");
String sub = test1.substring(idx1, idx2 > idx1 ? idx2 : test1.length());
Cela devrait probablement tenir compte du fait que indexOf et lastIndexOf peuvent renvoyer -1
C'est parce que dans votre deuxième chaîne lastIndexOf / est le même que pour / ws , vous pouvez donc y parvenir en utilisant un simple si l'instruction c'est-à-dire si elles sont identiques, le dernier index doit avoir la longueur String
String test1 = "https://31.191.110.125:443/App/ws/list/play";
String test2 = "https://31.191.110.125:443/App/ws/list";
int firstIndex = test2.indexOf("/ws");
int lastIndex = test2.lastIndexOf("/");
if(firstIndex == lastIndex){
lastIndex = test2.length();
}
String sub = test1.substring(firstIndex, lastIndex);
System.out.println("Substring: " + sub);
Vous pouvez utiliser une expression régulière:
Matcher m = Pattern.compile("/ws/.*?(?=/|$)").matcher("https://31.191.110.125:443/App/ws/list");
if (m.find()) {
System.out.println(m.group());
} else {
System.out.println("There is no /ws/");
}
comme celle-ci
/ws/.*?(?=/|$)
Il trouve d'abord / ws / , puis correspond à chaque caractère paresseusement jusqu'à ce qu'il trouve soit la fin de la chaîne, soit un / .
Vous pouvez voir une explication plus détaillée de l'expression régulière et tester plus de chaînes ici .
Modifier:
Comme Andy Turner l'a suggéré , / ws / [^ /] * est une autre expression régulière que vous pouvez utiliser, et est également plus rapide. Il trouve d'abord / ws / puis correspond à 0 ou plus de caractères autres que / , autant que possible.
Vous pouvez faire l'équivalent de réponse de Sweeper sans expression régulière, si vous le souhaitez:
int start = test1.indexOf("/ws/");
if (start >= 0) {
int end = test1.indexOf("/", start + "/ws/".length());
String found = end >= 0 ? test1.substring(start, end) : test1.substring(start);
// ...
}
Quelle est la règle ici? Tout de
/ wsà où?@Sweeper de / ws au premier / ou à la fin de la chaîne s'il n'y a pas de /
Mais dans la deuxième chaîne, il y a un
/après/ ws, donc la sortie de la deuxième chaîne doit être/ ws /, n'est-ce pas? Ou voulez-vous dire le premier/après/ ws /?@Sweeper Oui, vous avez raison dans votre deuxième partie, j'ai édité la question