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