c# - regulares - expresion regular solo numeros y punto decimal
Parse el nombre de archivo de la ruta completa usando expresiones regulares en C# (6)
¿Cómo puedo extraer el nombre de archivo de una ruta completa usando 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 las 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 solo 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 yo hasta que sepa cuál es la respuesta.
Aquí hay un enfoque:
string filename = Regex.Match(filename, @".*//([^//]+$)").Groups[1].Value;
Básicamente, coincide con todo 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.
// 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: eliminación de barra inicial
/w+://(/w+//)*(?<file>/w*/./w*)
Obviamente, esto debería expandirse para abarcar todos los caracteres de ruta, pero el "archivo" del grupo nombrado contiene su nombre de archivo para la ruta de acceso de ejemplo proporcionada.
Deberías 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 / Mi aplicación
- Linux: / [User] / My App Stuff
¿Por qué debes usar expresiones regulares? .NET tiene el método Path.GetFileName()
específicamente para esto, que funciona en plataformas y sistemas de archivos.
Corta:
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 oficial de la biblioteca que mencionaste:
string file = System.IO.Path.GetFileName(fullpath);