2009-07-08 10 views
6

Si je veux correspondre seulement fileName, i.e.,fileName extrait en utilisant Regex

à C://Directory/FileName.cs, en quelque sorte ignorer tout avant FileName.cs utilisant l'expression rationnelle.

Comment puis-je le faire?

J'ai besoin de cela pour une interface utilisateur compilée sur laquelle je travaille ... je ne peux pas utiliser le langage de programmation car il n'accepte que Regex.

Des idées?

+1

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

+0

@sumesh, est-ce que le regEx que j'ai fourni dans ma réponse fonctionne pour vous? Si ce n'est pas le cas, pouvez-vous fournir plus d'informations sur les fonctionnalités spécifiques à regEx supportées par votre moteur? –

+0

Non ça n'a pas fonctionné, Ce moteur ne supporte que Regex, il y a deux params 1er param. Fichier à scanner 2ème param. pattern to match Le chemin d'accès au fichier est spécifié ailleurs.Le problème ici est, 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 en quelque sorte je dois passer une regex pour que le moteur scanne uniquement le fichier et non le chemin entier. donc, en premier param, si je peux spécifier le nom de fichier, c'est-à-dire quelque chose après/mais avant .cs, tout le monde devrait être heureux. –

Répondre

13

Quelque chose comme cela pourrait fonctionner:

[^/]*$ 

Il correspond à tous les caractères à la fin de la ligne qui ne sont pas «/» ..

Si vous voulez faire correspondre les chemins qui utilisent le « \ "séparateur de chemin vous changerait la regex:

[^\]*$ 

mais assurez-vous d'échapper au « caractère \ » si votre langage de programmation ou de l'environnement exige. Par exemple, vous pourriez avoir à écrire quelque chose comme ceci:

 
[^\\]*$ 

EDIT j'ai enlevé le premier «/» et arrière «/» comme ils peuvent être source de confusion, car ils ne sont pas vraiment partie de la regex mais ils sont très communs de représenter une expression régulière. Et bien sûr, en fonction des fonctionnalités prises en charge par le moteur regEx, vous pouvez utiliser le mode anticipé/look-behind et la capture pour créer un meilleur fichier regEx.

+0

Vous devez toujours utiliser deux barres obliques inverses dans la regex pour en faire correspondre une dans la chaîne cible. Si vous utilisez un langage comme Java qui ne fournit pas de littéraux regex ou de chaînes raw/verbatim, vous devez leur échapper deux fois: "[^ \\\\] *" –

+0

lol j'ai passé une heure à jouer avec lookbehinds et enfin eu une regex avec comme 100 caractères pour travailler ... puis j'ai vu le vôtre ... supprimé tous les regards derrière et ça a toujours fonctionné. : P – Victor

0

Je voudrais utiliser:. /(. $)

Les parenthèses marquent un groupe qui est le nom de fichier. L'expression régulière que vous utilisez peut varier dependig sur la syntaxe regex (PCRE, Posix)

Je vous conseille de utiliser un outil de regex, il existe plusieurs pour Windows et Linux:

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

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

Linux - kodos

Hope it helps

4

Sur la base de votre commentaire de devoir exclure des chemins qui ne correspondent pas 'abc', essayez ceci:

^.+/(?:(?!abc)[^/])+$ 


complètement divisé en mode commentaire regex, qui est la suivante:

(?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

juste une variation sur miky qui fonctionne pour les deux caractères de chemin du système de fichiers: [^\\/]*\s

0

Supposons que le fichier na moi a des caractères spéciaux, spécialement en supportant MAC où les caractères spéciaux permettent dans les noms de fichiers, côté serveur Path.GetFileName (fileName) échoue et lance l'erreur en raison des caractères illégaux dans le chemin. Le code suivant utilisant regex vient pour le secours.

qui suit prendre soin de regex 2 choses

  1. Dans IE, lorsque le fichier est téléchargé, le chemin du fichier contient des dossiers aswell (par exemple c: \ exemple_dossier \ sous-dossier \ Sample.xls). L'expression ci-dessous remplacera tous les dossiers par une chaîne vide et conservera le nom du fichier

  2. Utilisé sous Mac, le nom de fichier est la seule chose fournie en tant que navigateur de safari et autorise des caractères spéciaux dans le nom du fichier.

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

Je suis bien en retard à la fête et j'ignore également l'exigence de regex parce que, comme J-16 SDiZ a souligné, parfois, il y a une meilleure solution. Même si la question date de 4 ans, les personnes à la recherche d'une solution simple méritent des choix.

Essayez d'utiliser les éléments suivants:

public string ConvertFileName(string filename) 
    { 
     string[] temparray = filename.Split('\\'); 
     filename = temparray[temparray.Length - 1]; 
     return filename; 
    } 

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

Bien que l'OP semble écrire pour UNIX, il n'en faut pas beaucoup pour comprendre comment l'adapter à vos besoins particuliers.

+0

Si vous descendez la route C#, pourquoi ne pas utiliser [Path.GetFileNamewithoutExtension] (http://msdn.microsoft.com/en-us/library/system.io.path.getfilenameWithoutextension.aspx)? – keyboardP

+0

@keyboardP Thats une option, mais dans mon cas particulier, les extensions sont importantes en tant que vérification visuelle. De plus, les chemins de fichiers que j'utilise sont générés par OpenFileDialog. Je n'utilise que le convertisseur pour créer une chaîne raccourcie pour l'interface utilisateur et, comme l'OP mentionné, je suis préoccupé par tout nixing tout le nom de fichier avant le nom de fichier, pas après. – spugm1r3

Questions connexes