Semblable à une question posée ici , je recherche une solution en Java.
Autrement dit, comment trouver l'index de la nième occurrence d'un caractère / chaîne à partir d'une chaîne?
Exemple: " / dossier1 / dossier2 / dossier3 / ". Dans ce cas, si je demande la 3e occurrence de la barre oblique (/), elle apparaît avant le dossier3, et j'espère renvoyer cette position d'index. Mon intention réelle est de la sous-traiter à partir de la nième occurrence d'un caractère.
Existe-t-il une méthode pratique / prête à l'emploi disponible dans l'API Java ou devons-nous écrire une petite logique par nous-mêmes pour résoudre ce problème?
Aussi,
- J'ai rapidement cherché si une méthode était prise en charge à cet effet sur StringUtils d' Apache Commons Lang , mais je n'en trouve aucune.
- Les expressions régulières peuvent-elles aider à cet égard?
Réponses:
Si votre projet dépend déjà d'Apache Commons, vous pouvez utiliser
StringUtils.ordinalIndexOf
, sinon, voici une implémentation:Cet article a été réécrit sous forme d'article ici .
la source
lastIndexOf
.Je pense que la solution la plus simple pour trouver la Nième occurrence d'une chaîne est d'utiliser StringUtils.ordinalIndexOf () d'Apache Commons.
Exemple:
la source
Deux options simples se présentent:
charAt()
plusieurs reprisesindexOf()
plusieurs reprisesPar exemple:
Cela peut ne pas fonctionner aussi bien qu'une utilisation
indexOf
répétée, mais il est peut-être plus simple de bien faire.la source
Vous pouvez essayer quelque chose comme ceci:
Notez que j'ai fait quelques hypothèses dans l'expression régulière:
Comme demandé dans un commentaire, je vais essayer d'expliquer l'expression régulière:
(/[^/]*){2}/([^/]*)
/[^/]*
est un/
suivi de[^/]*
(n'importe quel nombre de caractères qui ne sont pas a/
),(/[^/]*)
regroupe l'expression précédente dans une seule entité. C'est le premier1
groupe de l'expression,(/[^/]*){2}
signifie que le groupe doit correspondre exactement aux{2}
heures,[^/]*
est à nouveau un nombre quelconque de caractères qui ne sont pas un/
,([^/]*)
regroupe l'expression previos dans une seule entité. Il s'agit du2
nd groupe de l'expression.De cette façon, vous n'avez qu'à obtenir la sous-chaîne qui correspond au 2ème groupe:
return m.group(2);
Image courtoisie par Debuggex
la source
J'ai apporté quelques modifications à la réponse d'aioobe et j'ai obtenu une nième version de lastIndexOf, et j'ai corrigé quelques problèmes de NPE. Voir le code ci-dessous:
la source
null
en argument. C'est le comportement le plus courant dans la bibliothèque standard.Faites correspondre tout ce qui est suivi de / deux fois, puis à nouveau. Le troisième est celui que tu veux
L' état Matcher peut être utilisé pour dire où se trouve le dernier /
la source
la source
Aujourd'hui, les StringUtils d'Apache Commons Lang sont pris en charge ,
C'est le primitif:
pour votre problème, vous pouvez coder ce qui suit:
StringUtils.ordinalIndexOf(uri, "/", 3)
Vous pouvez également rechercher la dernière nième occurrence d'un caractère dans une chaîne avec la méthode lastOrdinalIndexOf .
la source
Peut-être pourriez-vous y parvenir via la méthode String.split (..) également.
la source
Une autre approche:
la source
Cette réponse améliore la réponse de @aioobe. Deux bogues dans cette réponse ont été corrigés.
1. n = 0 doit renvoyer -1.
2. la nième occurrence a renvoyé -1, mais elle a fonctionné sur la n-1ième occurrence.
Essaye ça !
la source
la source
la source
Ma solution:
la source
Le code renvoie la nième sous-chaîne de positions d'occurrence aka largeur de champ. Exemple. si la chaîne "Stack overflow in low melow" est la chaîne pour rechercher la 2ème occurrence du jeton "low", vous conviendrez avec moi que la 2ème occurrence est à la sous-chaîne "18 et 21" . indexOfOccurance ("Stack overflow in low melow", low, 2) renvoie 18 et 21 dans une chaîne.
la source
la source