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 p> Ceci ne traite que le .txt. Comment puis-je gérer ".txt.gz"
Merci p> p>
6 Réponses :
Je pense que ce que vous voulez (après la direction que vous alliez), c'est ceci: à la fin, j'ai une déclaration conditionnelle. Il doit correspondre soit à la fin de la chaîne ( $ code>) ou doit correspondre à un point littéral suivi de 2 lettres ( \\. [A-ZA-Z] {2} < / code>). N'oubliez pas d'échapper au . Code>, car dans regex . Code> signifie "correspondre à n'importe quel caractère". P> P>
Merci de me corriger, le $ code> 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 $ code>) 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 code> 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.
Pourquoi pas simplement utiliser endswith code> au lieu de la réégalité complexe
Vous pouvez remplacer . [A-za-z] {3} code> avec .txt (\ \ gz) code>
? travaillera pour votre requis | . Essayez d'ajouter à votre regex d'origine p>
Un moyen possible de le faire: alors vous pouvez exécuter le test suivant: p>
Vous pouvez utiliser le regex ci-dessous pour atteindre votre objectif: explication de la regex ci-dessus: strong>] p> Vous pouvez trouver la démonstration de la regex ci-dessus regex ici. Fort > 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> | code> alternance (ou comme vous étiez attendu ou strong>) mais c'est lisible et plus efficace également. P>
blockQuote>
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));
}
}
}
En outre, avez-vous seulement envie de correspondrener
.txt code> et.txt.gx code> ou allez-vous bien avec la correspondance.tar.gz code> 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)? Code>?Pourquoi avez-vous besoin de correspondre à
.txt ou .txt.gz code> et traitez-les de la même manière? Je veux dire, si vous faites déjà correspondre.txt code> il est inutile de continuer à rechercher.gz code> 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 "))) code>?