112 votes

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 pratique/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,

  1. 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.
  2. Pouvez expressions régulières aider dans ce domaine?

139voto

aioobe Points 158466

Ceci devrait faire:

public static int nthOccurrence(String str, char c, int n) {
    int pos = str.indexOf(c, 0);
    while (n-- > 0 && pos != -1)
        pos = str.indexOf(c, pos+1);
    return pos;
}

Cet extrait de code...

String str = "/folder1/folder2/folder3/";
int index = nthOccurrence(str, '/', 2);
System.out.println(str.substring(index));

... des impressions:

/folder3/

69voto

Al Belsky Points 197

Je crois que la solution la plus simple pour trouver le n-ième occurrence d'une Chaîne est d'utiliser StringUtils.ordinalIndexOf() à partir de Apache Commons.

Exemple:

StringUtils.ordinalIndexOf("aabaabaa", "b", 2)  == 5

29voto

Jon Skeet Points 692016

Deux options simples se produire:

  • Utiliser charAt() à plusieurs reprises
  • Utiliser indexOf() à plusieurs reprises

Par exemple:

public static int nthIndexOf(String text, char needle, int n)
{
    for (int i = 0; i < text.length(); i++)
    {
        if (text.charAt(i) == needle)
        {
            n--;
            if (n == 0)
            {
                return i;
            }
        }
    }
    return -1;
}

Que peut bien ne pas effectuer ainsi que l'utilisation d' indexOf à plusieurs reprises, mais c'est peut-être plus simple pour obtenir le droit.

15voto

andcoz Points 1341

Vous pouvez essayer quelque chose comme ceci:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
      System.out.println(from3rd("/folder1/folder2/folder3/"));
    }

    private static Pattern p = Pattern.compile("(/[^/]*){2}/(.*)");

    public static String from3rd(String in) {
        Matcher m = p.matcher(in);

        if (m.matches())
            return m.group(2);
        else
            return null;
    }
}

Notez que je n'ai certaines hypothèses dans la regex:

  • le chemin est absolu (c'est à dire qui commence par "/");
  • vous n'avez pas besoin de la 3e "/" dans le résultat.

8voto

Goofy Points 141

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:

public int nthLastIndexOf(String str, char c, int n) {
        if (str == null || n < 1)
            return -1;
        int pos = str.length();
        while (n-- > 0 && pos != -1)
            pos = str.lastIndexOf(c, pos - 1);
        return pos;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X