2009-05-13 8 views
0

comment mettre en œuvre une telle exigence via regexp? J'ai une liste de noms de fichiers sous forme de chaîne.
LOAD_filesourceA-01012008-00001.dat
LOAD_filesourceB-01012008-00001.dat
LOAD_filesourceB-01012008-00003.dat
LOAD_filesourceA-01012008-00004.dat
LOAD_filesourceA-01012008-000055.dat
LOAD_filesourceB-01012008_000055 .dat
...
LOAD_filesourceB-01012008_000058.dat
etcJava + regex comment vérifier une telle chaîne "LOAD_filesourceB-01012008_000058.dat" pour le type et le numéro (6 derniers chiffres)

après le chargement de chaque fichier, ce fichier est déplacé dans une archive dire ctory ... et j'enregistre le type de fichier et le numéro de chargement (6 derniers caractères dans le nom de fichier)
J'ai 2 informations: 1- si le fichier que je souhaite charger est de type A ou B 2- le dernier En fonction de ceux-ci, je voudrais obtenir le nom de fichier du fichier suivant, c'est-à-dire le même type de fichier et le numéro de chargement (= les 6 derniers chiffres avant). ".dat" section) devrait être le prochain numéro disponible. dire chargé était 12, alors je vais chercher 13, sinon disponible 14, 15 etc .. jusqu'à ce que je traite tous les fichiers dans ce répertoire. Puis-je vérifier que c'est le type de fichier B et en supposant que le dernier numéro de fichier chargé était 57, il satisfait à l'exigence numéro 58. (> 57 Je veux dire)

Répondre

1

LOAD_filesource. (A | B) - [0-9] + - ([0-9]) + dat

A ou B se terminera dans le groupe 1, le nombre du fichier dans le groupe 2. Puis analyser le groupe 2 comme un entier décimal.

0

Je ne sais pas si c'est intentionnel ou non, mais vous avez listé deux formats différents, un qui utilise un trait d'union comme séparateur final et un autre qui utilise un trait de soulignement. Si les deux sont vraiment pris en charge, vous voulez:

LOAD_filesource(A|B)-[0-9]+[_-]([0-9])+.dat 

En outre, votre numéro six chiffres est parfois cinq chiffres (par exemple, le 00001 dans LOAD_filesourceA -...- 00001.dat), mais l'expression régulière ci-dessus ne nécessite au moins un chiffre est présent.

Selon le nombre de fichiers que vous allez essayer d'examiner, il vaudrait peut-être mieux charger une liste de répertoires plutôt que de vérifier au hasard si un fichier existe. Avec une méthode de comparaison appropriée, le tri de votre liste pourrait vous donner vos fichiers dans un ordre facile à travailler.

1

Voir ceci:

public class Match { 

    Pattern pattern = Pattern.compile("LOAD_filesource(A|B)-[0-9]{8}[_-]([0-9]{5,6})\\.dat"); 

    String files[] = { 
     "LOAD_filesourceA-01012008-00001.dat", 
     "LOAD_filesourceB-01012008-00001.dat", 
     "LOAD_filesourceB-01012008-00003.dat", 
     "LOAD_filesourceA-01012008-00004.dat", 
     "LOAD_filesourceA-01012008-000055.dat", 
     "LOAD_filesourceB-01012008_000055.dat", 
     "LOAD_filesourceB-01012008_000058.dat" 
    }; 

    public static void main(String[] args) { 
     new Match().run(); 
    } 

    private void run() { 
     for (String file : files) { 
      Matcher matcher = pattern.matcher(file); 

      System.out.print(String.format("%s %b %s %s\n", file, matcher.matches(), matcher.group(1), matcher.group(2))); 
     } 
    } 
} 

avec cette sortie:

LOAD_filesourceA-01012008-00001.dat true A 00001 
LOAD_filesourceB-01012008-00001.dat true B 00001 
LOAD_filesourceB-01012008-00003.dat true B 00003 
LOAD_filesourceA-01012008-00004.dat true A 00004 
LOAD_filesourceA-01012008-000055.dat true A 000055 
LOAD_filesourceB-01012008_000055.dat true B 000055 
LOAD_filesourceB-01012008_000058.dat true B 000058 
Questions connexes