2008-10-21 24 views
17

¿Cómo puedo extraer el nombre de archivo de una ruta completa usando expresiones regulares en C#?Parse nombre de archivo de la ruta completa utilizando expresiones regulares en C#

Supongamos que tengo la ruta completa C:\CoolDirectory\CoolSubdirectory\CoolFile.txt.

¿Cómo obtengo CoolFile.txt usando el sabor .NET de expresiones regulares? No soy muy bueno con las expresiones regulares, y mi amigo de RegEx y yo no podíamos entender esto.

Además, en el curso de tratar de resolver este problema, me di cuenta de que puedo usar System.IO.Path.GetFileName, pero el hecho de que no pude entender la expresión regular me está haciendo infeliz y me va a molestar hasta Sé cuál es la respuesta.

+17

Está bien, quieres saber cómo funcionaría_ con expresiones regulares, pero para hacer de este mundo un lugar mejor, prométete que usarás Path.* de todos modos :) – OregonGhost

+0

GetFileName puede no ser una opción si está trabajando con [Long Path] (http://bcl.codeplex.com/wikipage?title=Long%20Path) –

+0

Hay razones para y contra Regex: http: //www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html – benPearce

Respuesta

18
// using System.Text.RegularExpressions; 

/// <summary> 
/// Regular expression built for C# on: Tue, Oct 21, 2008, 02:34:30 PM 
/// Using Expresso Version: 3.0.2766, http://www.ultrapico.com 
/// 
/// A description of the regular expression: 
/// 
/// Any character that is NOT in this class: [\\], any number of repetitions 
/// End of line or string 
/// 
/// 
/// </summary> 
public static Regex regex = new Regex(
     @"[^\\]*$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

ACTUALIZACIÓN: eliminado barra comenzando

+1

Te das cuenta de que va a obtener "\ CoolFile.txt" – dlamblin

+0

Buena captura, no pasó por mi mente que la barra no debería estar allí cuando lo probé – bdukes

34

¿Por qué debe usar expresiones regulares? .NET tiene incorporado el método Path.GetFileName() específicamente para esto, que funciona en plataformas y sistemas de archivos.

+0

No leyó la pregunta con cuidado. Está al tanto de GetFileName(), pero quiere saber cómo hacerlo con reg ex. – Kon

+4

Cuando publiqué mi respuesta, esa oración no estaba allí. –

+1

Entonces no dude en ignorarme. :) – Kon

6

Aquí es uno de los enfoques:

string filename = Regex.Match(filename, @".*\\([^\\]+$)").Groups[1].Value; 

Básicamente, que coincide con lo que entre la última barra invertida y el final de la cadena. Por supuesto, como mencionaste, usar Path.GetFileName() es mucho más fácil y manejará muchos casos extremos que son difíciles de manejar con regex.

+0

+1 porque pude resolver un Perl problema de expresión regular con él. Gracias. –

1
\w+:\\(\w+\\)*(?<file>\w*\.\w*) 

Obviamente, esto necesitaría expandir para cubrir todos los caracteres de ruta, pero el "archivo" nombre de grupo contiene el nombre del archivo para el ejemplo de ruta dada.

+0

solo curiosidad, ¿qué hace el siguiente grupo? (? \ w * \. \ W *). debería ser (?:) – Artru

+0

@Artu: '(? \ w * \. \ W *)' es un grupo de captura con nombre. –

4

Shorter:

string filename = Regex.Match(fullpath, @"[^\\]*$").Value; 

O:

string filename = Regex.Match(fullpath, "[^\\"+System.IO.Path.PathSeparator+"]*$").Value; 

Sin Regex:

string[] pathparts = fullpath.Split(new []{System.IO.Path.PathSeparator}); 
string file = pathparts[pathparts.Length-1]; 

El soporte de la biblioteca oficial que usted ha mencionado:

string file = System.IO.Path.GetFileName(fullpath); 
0

Debería usar la clase System.Path. Significará que tendrá que preocuparse por menos si alguna vez decide admitir Mono/Linux (el ejemplo de dlamblin tiene en cuenta el separador de ruta, pero puede obtener un sistema operativo extraño que tiene rutas extrañas). La clase System.Path también puede combinar dos caminos en uno. Así, por ejemplo:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My App Stuff"); 

resolvería a:

  • Windows: C: \ Documents and Settings \ [usuario] \ Mis documentos \ My App materia
  • Linux:/[usuario]/Mi aplicación cosas
Cuestiones relacionadas