web-dev-qa-db-fra.com

Obtenir une sous-chaîne à partir d'une chaîne en Java

J'ai le texte suivant:

..., Niedersachsen, PAS EN CHARGE DEPUIS: 03.2009, CATÉGORIE: ...,

Maintenant, je veux extraire la date après le NOT IN CHARGE SINCE: jusqu'à la virgule. Je n'ai donc besoin que de 03.2009 pour obtenir ma sous-chaîne.

Alors, comment puis-je gérer ça?

String substr = "not in charge since:";
String before = s.substring(0, s.indexOf(substr));
String after = s.substring(s.indexOf(substr),s.lastIndexOf(","));

MODIFIER

for (String s : split) {
    s = s.toLowerCase();
    if (s.contains("ex peps")) {
        String substr = "not in charge since:";
        String before = s.substring(0, s.indexOf(substr));
        String after = s.substring(s.indexOf(substr), s.lastIndexOf(","));

        System.out.println(before);
        System.out.println(after);
        System.out.println("PEP!!!");
    } else {
        System.out.println("Line ok");
    }
}

Mais ce n'est pas le résultat que je veux.

5
Captai-N

Vous pouvez utiliser des motifs par exemple:

String str = "Niedersachsen,NOT IN CHARGE SINCE: 03.2009, CATEGORY";
Pattern p = Pattern.compile("\\d{2}\\.\\d{4}");
Matcher m = p.matcher(str);

if (m.find()) {
    System.out.println(m.group());
}

Sortie

03.2009

Remarque: si vous souhaitez obtenir des dates similaires dans toute votre chaîne, vous pouvez utiliser while au lieu de if.


Modifier

Ou vous pouvez utiliser:

String str = "Niedersachsen,NOT IN CHARGE SINCE: 03.03.2009, CATEGORY";
Pattern p = Pattern.compile("SINCE:(.*?)\\,");
Matcher m = p.matcher(str);

if (m.find()) {
    System.out.println(m.group(1).trim());
}
7
YCF_L

Bien sûr, les expressions régulières vous donnent plus de moyens de rechercher/mettre en correspondance, mais en supposant que le ":" est l'élément clé que vous recherchez (et il apparaît exactement une fois dans cette position), puis:

s.substring(s.indexOf(':')+1, s.lastIndexOf(',')).trim();

est le moyen "le plus simple" et le "moins onéreux" de récupérer cette sous-chaîne.

Astuce: lorsque vous recherchez un seul caractère, utilisez un caractère comme motif de recherche; pas une ficelle!

3
GhostCat

Vous pouvez utiliser : pour séparer les String s. 

String substr = "NOT IN CHARGE SINCE:";
String before = s.substring(0, s.indexOf(substr)+1);
String after = s.substring(s.indexOf(':')+1, s.lastIndexOf(','));
2
Sky

Si vous avez un cas d'utilisation plus générique et que vous connaissez bien la structure du texte, vous pouvez tirer profit de l'utilisation d'expressions régulières:

Pattern pattern = Pattern.compile(".*NOT IN CHARGE SINCE: \([0-9.]*\),");
Matcher matcher = pattern.matcher(line);
System.out.println(matcher.group());
1
Matthias

Une façon plus générique de résoudre votre problème consiste à utiliser Regex pour faire correspondre chaque groupe entre: et,

Pattern pattern = Pattern.compile("(?<=:)(.*?)(?=,)");
Matcher m = p.matcher(str);

Vous devez créer un motif pour cela. Essayez ceci comme un simple point de départ regex et n'hésitez pas à l'improviser:

String s = "...,Niedersachsen,NOT IN CHARGE SINCE: 03.2009, CATEGORY:....,";
Pattern pattern = Pattern.compile(".*NOT IN CHARGE SINCE: ([\\d\\.]*).*");
Matcher matcher = pattern.matcher(s);

if (matcher.find())
{
    System.out.println(matcher.group(1));
}

Cela devrait vous rapporter n'importe quel groupe de chiffres que vous avez reçu comme date.

0
Chiranjib