Comment trouver le n-ième occurrence d'un caractère dans une chaîne de caractères?
Semblable à une question posté ici, je suis à la recherche
pour une solution en Java.
Qui est, comment trouver l'index de la nième occurrence d'un caractère ou chaîne de caractères à partir d'une chaîne?
Exemple: "/dossier1/dossier2/dossier3/".
Dans ce cas, si je demande pour la 3ème apparition de la barre oblique (/), il apparaît dossier3, et j'attends le retour de cette position d'index. Mon intention est de sous-chaîne à partir de la nième occurrence d'un caractère.
Est-il commode/prêt-à-utiliser la méthode disponible dans l'API Java, ou devons-nous écrire une petite logique sur notre propre résoudre ce problème?
Aussi,
- J'ai rapidement cherché si une méthode est prise en charge à cette fin, Apache Commons Lang StringUtils, mais je ne trouve pas du tout.
- Pouvez expressions régulières aider dans ce domaine?
- Pour votre exemple, en fonction de ce que vous voulez faire avec le résultat, il peut être plus facile de diviser la chaîne sur /, qui pourrait bien vous donner ce dont vous avez besoin directement?
- C'est une bonne idée aussi.
Vous devez vous connecter pour publier un commentaire.
Si votre projet dépend déjà Apache Commons, vous pouvez utiliser
StringUtils.ordinalIndexOf
, sinon, voici une mise en œuvre:Ce message a été réécrit comme un article ici.
lastIndexOf
.Je crois que la solution la plus simple pour trouver le n-ième occurrence d'une Chaîne est d'utiliser StringUtils.ordinalIndexOf() de Apache Commons.
Exemple:
Deux options simples se produire:
charAt()
à plusieurs reprisesindexOf()
à plusieurs reprisesPar exemple:
Que peut bien ne pas effectuer aussi bien que l'utilisation de
indexOf
à plusieurs reprises, mais c'est peut-être plus simple pour obtenir le droit.Vous pouvez essayer quelque chose comme ceci:
Notez que je n'ai certaines hypothèses dans la regex:
Comme demandé dans un commentaire, je vais essayer d'expliquer la regex:
(/[^/]*){2}/([^/]*)
/[^/]*
est un/
suivie par[^/]*
(n'importe quel nombre de caractères qui ne sont pas un/
),(/[^/]*)
groupes de l'expression précédente en une seule entité. C'est le1
saint-groupe de l'expression,(/[^/]*){2}
signifie que le groupe doit correspondre à extactly{2}
fois,[^/]*
est de nouveau un nombre quelconque de caractères qui ne sont pas un/
,([^/]*)
groupes de la previos expression dans une seule entité. C'est le2
groupe nd de l'expression.De cette façon, vous n'avez qu'à obtenir de la chaîne qui correspond au 2ème groupe:
return m.group(2);
Image reproduite par Debuggex
J'ai fait quelques changements à aioobe de la réponse et a obtenu une nième lastIndexOf version, et de résoudre certains des NPE problèmes. Voir le code ci-dessous:
null
comme argument. C'est le plus commun de comportement dans la bibliothèque standard.Correspondent à rien de ce suivi de /deux fois, puis de nouveau. Le troisième est celui que vous souhaitez
La Matcher état peut être utilisé pour indiquer où le dernier /est
Aujourd'hui, il EST le soutien de Apache Commons Lang StringUtils,
C'est la primitive:
pour votre problème, vous pouvez écrire le code suivant:
StringUtils.ordinalIndexOf(uri, "/", 3)
Vous pouvez également trouver le dernier n-ième occurrence d'un caractère dans une chaîne avec le lastOrdinalIndexOf méthode.
Une autre approche:
Cette réponse s'améliore sur @aioobe 's réponse. Deux bugs dans cette réponse a été corrigé.
1. n=0 doit retourner -1.
2. nième occurrence retourné -1, mais il a travaillé sur n-1ème fois.
Essayer cette !
Peut-être vous pourriez obtenir ce par le biais de la Chaîne.split(..) la méthode aussi.
Ma solution:
Le code renvoie le n-ième occurrence des postes de sous-chaîne aka largeur de champ. Exemple. si la chaîne "débordement de Pile faible melow" est la chaîne de caractères à rechercher 2e moment de jeton "faible", vous serez d'accord avec moi que c'2ème occurrence est à subtring "18 et 21". indexOfOccurance("débordement de Pile faible melow", faible, 2) retourne le 18 et le 21 dans une chaîne de caractères.