9
votes

Extrait nom de fichier à l'aide de regex

Si je veux correspondre uniquement au nom de fichier , i.e,

dans c: //directory/filename.cs , en quelque sorte ignore tout avant FileName.cs à l'aide de regex.

Comment puis-je le faire?

J'ai besoin de cela pour une interface utilisateur compilée que je travaille sur ... ne peut pas utiliser la langue de programmation car elle n'accepte que regex.

Des idées?


4 commentaires

Je me demande toujours pourquoi les gens demandent une regex quand il y a une solution plus simple.


@sumesh, la regex a-t-elle fourni dans mon travail de réponse pour vous? Si ce n'est pas le cas, pouvez-vous fournir plus d'informations sur les fonctionnalités spécifiques à la regex sont prises en charge par votre moteur?


Non, cela n'a pas fonctionné, ce moteur prend uniquement en charge Regex, il existe deux paramètres 1st param. Fichier pour analyser 2nd param. Motif pour correspondre au chemin du fichier est spécifié d'une autre chose. Le problème ici est que ma règle d'application dit qu'il ne devrait pas y avoir "ABC" dans un nom de fichier, mais ABC peut être dans le chemin du fichier, par exemple, c: //folder/abc/folder/filename.cs maintenant, je dois maintenant passer Une regex de sorte que le moteur ne scanne que le fichier et non tout le chemin. Donc, dans le premier paramètre, si je peux spécifier le nom de fichier, c'est-à-dire quoi que ce soit après / mais avant .cs, tout le monde devrait être heureux.


Sumesh - Ensuite, mettez toutes ces informations dans la question initiale! Extraire d'un nom de fichier et à l'exclusion d'une information spécifique d'une certaine partie d'une regex sont des tâches très différentes.


11 Réponses :


7
votes

Quelle langue utilisez-vous? Pourquoi n'utilisez-vous pas les mécanismes de chemin standard de cette langue?

Comment sur http://msdn.microsoft.com/ EN-US / Bibliothèque / System.IO.Path.aspx ?


2 commentaires

Cette. Spécifiquement la méthode getfileName ().


Je suis d'accord, API d'abord, Regex Deuxième.



16
votes

Quelque chose comme ça pourrait fonctionner:

[^\\]*$


2 commentaires

Vous devez toujours utiliser deux backslashes dans la regex pour correspondre à une dans la chaîne cible. Si vous utilisez une langue comme Java qui ne fournit pas de cordes de regex ni de chaînes brut / verbatim, vous devez les échapper à: "[^ \\\] *"


LOL J'ai passé une heure à jouer avec Lookbehinds et j'ai enfin eu une regex avec 100 personnages à travailler ... Puis j'ai vu le vôtre ... supprimé tout le look derrière et ça a toujours travaillé. : P



0
votes

J'utiliserais :. / (. $)

La parenthèse marque un groupe qui est le nom du fichier. L'expression régulière que vous utilisez peut varier en fonction de la syntaxe de regex (PCRE, POSIX)

I SUBTE que vous utilisez un outil de regex, il y en a plusieurs pour Windows et Linux:

Windows - http://sourceforge.net/projects/regexcreate/

Windows - http://weitz.de/regex-coach/

Linux - Kodos

espère qu'il aide


0 commentaires

5
votes

Basé sur votre commentaire de ne pas avoir besoin d'exclure les chemins qui ne correspondent pas à «ABC», essayez ceci:

(?x)     # flag to enable comments
^        # start of line

.+       # match any character (except newline)
         #   greedily one or more times
/        # a literal slash character

(?:      # begin non-capturing group
  (?!      # begin negative lookahead
           # (contents must not appear after the current position)
    abc      # literal text abc
  )        # end negative lookahead
  [^/]     # any character that is not a slash
)        # end non-capturing group
+        # repeat the above nc group one or more times
         #   (essentially, we keep looking for non-backspaces that are not 'abc')

$        # end of line


0 commentaires

0
votes

juste une variation sur Miky's qui fonctionne pour les deux caractères de chemin de fichiers: [^ \\ /] * \ s


0 commentaires

0
votes

Supposons que le nom du fichier comporte des caractères spéciaux, spécialement en prenant en charge Mac où des caractères spéciaux permettent des noms de fichiers, le chemin latéral du serveur.getfilename (nom de fichier) échoue et jette une erreur en raison de caractères illégaux dans le chemin. Le code suivant à l'aide de Regex vient pour le sauvetage.

La regex suivante prend en charge 2 choses p>

  1. dans IE, lorsque le fichier est téléchargé, le chemin de fichier contient des dossiers ASWELL (I.E. C: \ SampleFolder \ Subfolder \ Sample.xls). L'expression ci-dessous remplacera tous les dossiers avec une chaîne vide et conservera le nom de fichier p> li>

  2. Lorsqu'il est utilisé dans Mac, le nom de fichier est la seule chose fournie comme navigateur de safari et permet des caractères spéciaux dans le nom de fichier. P>

    var regExpDir = @"(^[\w]:\\)([\w].+\w\\)";
    
    var fileName = Regex.Replace(fileName, regExpDir, string.Empty);
    


0 commentaires

1
votes

Je suis à la fin de la fête et j'ignore également l'exigence de regex car, comme l'a souligné J-16 SDIZ, il y a parfois une meilleure solution. Même si la question ait 4 ans, des personnes à la recherche d'une solution simple méritent des choix.

Essayez d'utiliser les éléments suivants: xxx

Cette méthode divise la chaîne sur "\ "Caractère, stocke les chaînes résultantes dans un tableau et renvoie le dernier élément de la matrice (nom de fichier).

Bien que l'OP semble écrire pour UNIX, il ne faut pas beaucoup pour déterminer comment l'adapter à votre besoin particulier.


2 commentaires

Si vous descendez dans la route C #, pourquoi ne pas utiliser Path.getfilenamewithoutextension ?


@KeyboardP c'est une option, mais dans mon cas particulier, les extensions sont importantes comme une vérification visuelle. De plus, les filechas que j'utilise sont générés par un openFileDialog. J'utilise uniquement le convertisseur pour créer une chaîne raccourcie pour l'interface utilisateur et, comme l'OP mentionné, je suis concerné par Nixing tout avant le nom du fichier, pas après.



0
votes

Je l'ai fait sans regex dans PowerShell:

  1. Mettez le lien dans une variable

    $ link = " http: //some.url/some/path/file.nom "

    1. diviser le lien sur le caractère "/" caractère

      $ fractionné = $ link.split ("/")

      1. compter les scissions

        $ splitcount = $ Split.Count

        1. cible le nom de fichier

          $ divisée [$ splitcount -1]

          Code complet: xxx


0 commentaires

0
votes

Une solution plutôt élégante avec lookahead et lookbehind n'a pas été mentionnée:

(? <=. +) (? =. CS)


0 commentaires

0
votes

Voir comme le nom de fichier peut être interprété comme le nom de base par certains. Ensuite, cet exemple peut extraire le nom de fichier / basseName pour tout fichier qui pourrait ne pas avoir d'extension pour une raison quelconque. Il peut également obtenir le dernier répertoire de la même manière.

Vous pouvez voir comment cela fonctionne et le teste ici. https://regexr.com/4ht5v p>

Le REGEXP est: P>

. +? \\ (? = \ w +) | \. \ w + $ | \\ $ code> p>

// Example of getting a BaseFileName from a path

var path = "C:\\Directory\\FileName.cs";
var result = path.replace(/.+?\\(?=\w+)|\.\w+$|\\$/gm,"");
console.log(result);


0 commentaires

2
votes

L'expression de regex qui l'a fait pour moi était xxx


0 commentaires