1
votes

Fin conditionnelle de sous-chaîne Java

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 commentaires

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


4 Réponses :


0
votes

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());


1 commentaires

Cela devrait probablement tenir compte du fait que indexOf et lastIndexOf peuvent renvoyer -1



0
votes

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);


0 commentaires

2
votes

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.


0 commentaires

1
votes

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);
  // ...
}


0 commentaires