0
votes

Expression régulière pour gérer deux extensions de fichier différentes

J'essaie de créer une expression régulière qui prend un fichier de nom "abcd_04-04-2020.txt" ou "abcd_04-04-2020.txt.gz"

Comment puis-je gérer la condition "ou" de la condition de l'extension. C'est ce que j'ai jusqu'à présent xxx

Ceci ne traite que le .txt. Comment puis-je gérer ".txt.gz" Merci


5 commentaires

En outre, avez-vous seulement envie de correspondrener .txt et .txt.gx ou allez-vous bien avec la correspondance .tar.gz et d'autres choses ?


Just .txt et .txt.gz. Je dois maintenant utiliser un "|" mais je me perds avec ça


Alors pourquoi ne pas utiliser \. Txt (\. Gz)? ?


Pourquoi avez-vous besoin de correspondre à .txt ou .txt.gz et traitez-les de la même manière? Je veux dire, si vous faites déjà correspondre .txt il est inutile de continuer à rechercher .gz juste après.


Y a-t-il une raison pour laquelle vous devez le faire avec une seule expression régulière? Qu'est-ce qui ne va pas avec si (nom de fichier.matches ("[\\ w ._-] + [0-9] {2} - [0-9] {2} - [0-9] {4}. [ a-za -z] {3} ") && (nom de fichier.endswith (". txt ") || FileName.endswith (". txt.gz "))) ?


6 Réponses :


1
votes

Je pense que ce que vous voulez (après la direction que vous alliez), c'est ceci: xxx

à la fin, j'ai une déclaration conditionnelle. Il doit correspondre soit à la fin de la chaîne ( $ ) ou doit correspondre à un point littéral suivi de 2 lettres ( \\. [A-ZA-Z] {2} < / code>). N'oubliez pas d'échapper au . , car dans regex . signifie "correspondre à n'importe quel caractère".


3 commentaires

Merci de me corriger, le $ est une bonne prise. En ce qui concerne l'utilisation de littéraux, ce n'est pas la façon dont la puissance l'avait dans leur exemple et que toutes les autres réponses semblent le faire quand même, je laisserai ma réponse tel qu'il est (corriger le $ ) et laissez l'Op décider de ce qu'ils voulaient vraiment.


À ce jour, il y a 5 autres réponses, dont 4 traite "TXT" et "GZ" comme littéraux. Pour moi, correspondant aux noms de fichiers se terminant par une période suivie d'exactement deux lettres n'ont aucun sens. Le fait que la regex de l'OP ne soit presque pas pertinente.


Je ne peux pas savoir quelles sont les intentions de l'OP, j'accepte que cela a peu de sens dans le contexte donné, mais peut-être qu'ils veulent correspondre à l'extension de fichier .rtf.gz aussi. J'ai donné une solution alternative différente des autres, et je laisserai l'OP décider quelle approche est "correcte" pour leurs besoins.



2
votes

Pourquoi pas simplement utiliser endswith au lieu de la réégalité complexe xxx


0 commentaires

1
votes

Vous pouvez remplacer . [A-za-z] {3} avec .txt (\ \ gz) xxx


0 commentaires

1
votes

? travaillera pour votre requis | . Essayez d'ajouter xxx

à votre regex d'origine xxx


0 commentaires

1
votes

Un moyen possible de le faire: xxx

alors vous pouvez exécuter le test suivant: xxx


0 commentaires

2
votes

Vous pouvez utiliser le regex ci-dessous pour atteindre votre objectif: xxx pré>

explication de la regex ci-dessus: strong>] p>

^, $ code> strong> - matchs début et fin de la chaîne de test resp. p>

[\ w -] + code> strong> - correspond à un caractère de mot avec un trait d'union un ou plusieurs fois. P>

\ d {} code> strong> - correspond à des chiffres autant de chiffres que ceux mentionnés dans les accolades. p>

(?: \. gz)? code> strong> - représente une correspondance de groupe non capturé .gz code> zéro ou une fois en raison de ? Quantifier strong>. Vous auriez pu utiliser | code> alternance (ou comme vous étiez attendu ou strong>) mais c'est lisible et plus efficace également. P> blockQuote>

Vous pouvez trouver la démonstration de la regex ci-dessus regex ici. Fort > p>

Visualisation d'expression régulière P>

Mise en œuvre en JAVA: strong> p>

import java.util.regex.*;
public class Main
{
    private static final Pattern pattern = Pattern.compile("^[\\w-]+\\d{2}-\\d{2}-\\d{4}\\.txt(?:\\.gz)?$", Pattern.MULTILINE);
    public static void main(String[] args) {
        String testString = "abcd_04-04-2020.txt\nabcd_04-04-2020.txt.gz\nsomethibsnfkns_05-06-2020.txt\n.txt.gz";
        Matcher matcher = pattern.matcher(testString);
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}


0 commentaires